【问题标题】:select inner join column2 NULL [closed]选择内部连接column2 NULL [关闭]
【发布时间】:2013-03-17 21:25:30
【问题描述】:

表关闭

id cls_id users_id

1----1---------1

2----1---------2

sql

select cls_id,
cls_name,
MAX(case when rn = 1 then users_id end) user_id1,
MAX(case when rn = 2 then users_id end) user_id2
from
(
SELECT cr.cls_id, 
    cr.cls_name, 
    u1.users_id,
    ROW_NUMBER() over(partition by cr.cls_id order by u1.users_id) rn
FROM classroom cr
INNER JOIN clsown co
    ON co.cls_id = cr.cls_id 
INNER JOIN users AS u1 
    ON co.users_id = u1.users_id and u1.users_id =1
) d
group by cls_id, cls_name;

我明白了

cls_id cls_name users_id1 users_id2
  1     room1       1        NULL

我想看看

cls_id cls_name users_id1 users_id2
  1     room1       1         2

【问题讨论】:

  • @bluefeet users_id2 NULL
  • 请看这个演示 -- sqlfiddle.com/#!3/87e1c/2 -- 我无法重现这个问题
  • 如果演示不正确,请在您的问题中扩展您的数据集并说明您的需求。

标签: sql sql-server-2008 inner-join


【解决方案1】:

您的代码中包含and u1.users_id =1,这就是您获得所见结果的原因。 bluefeet 的 SQL Fiddle 显示没有它的结果,看起来它工作正常。

select cls_id,
    cls_name,
    MAX(case when rn = 1 then users_id end) user_id1,
    MAX(case when rn = 2 then users_id end) user_id2
from
(
    SELECT cr.cls_id, 
        cr.cls_name, 
        u1.users_id,
        ROW_NUMBER() over(partition by cr.cls_id order by u1.users_id) rn
    FROM classroom cr
    INNER JOIN clsown co
        ON co.cls_id = cr.cls_id 
    INNER JOIN users AS u1 
        ON co.users_id = u1.users_id 
) d
group by cls_id, cls_name;

SQL Fiddle Demo

【讨论】:

  • 我在您的答案中添加了正确的代码和演示。
  • 我成功了。
  • ON co.cls_id = cr.cls_id and cr.cls_id in(select cls_id from clsown where users_id=1)
【解决方案2】:

on 子句中删除and ul.users_id = 1

select cls_id,
cls_name,
MAX(case when rn = 1 then users_id end) user_id1,
MAX(case when rn = 2 then users_id end) user_id2
from
(
SELECT cr.cls_id, 
    cr.cls_name, 
    u1.users_id,
    ROW_NUMBER() over(partition by cr.cls_id order by u1.users_id) rn
FROM classroom cr
INNER JOIN clsown co
    ON co.cls_id = cr.cls_id 
INNER JOIN users AS u1 
    ON co.users_id = u1.users_id
) d
group by cls_id, cls_name;

【讨论】:

  • 是,但显示所有用户
  • @Harajukuzz 会的,是的。对于当前的设计,如果您只想要一个结果集,则必须从上面的查询WHERE user_id1 = 1 中提取结果集。
  • @Harajukuzz 。 . .它将显示两个用户,这是您在 questino 的查询中指定的用户。
猜你喜欢
  • 2016-11-12
  • 1970-01-01
  • 2019-08-21
  • 2021-03-16
  • 2013-03-16
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多