2013-03-26 128 views
1

我第一次使用。选择内部连接表ID vb

SELECT classroom .cls_id, 
    classroom.cls_name, 
    u1.users_id as users_id1, 
    u2.users_id as users_id2 
FROM classroom 
    INNER JOIN clsown 
      ON clsown.cls_id = classroom .cls_id 
    INNER JOIN users AS u1 
      ON clsown.users_id = u1.users_id 
    INNER JOIN users AS u2 
      ON clsown.users_id = u2.users_id 

我得到这个:

cls_id cls_name users_id1 users_id2 

1 -------- room1 ------- 1 --------- 1 
1 -------- room1 ------- 2 --------- 2 
2 -------- room2 ------- 3 --------- 3 
2 -------- room2 ------- 4 --------- 4 

我希望看到

cls_id cls_name users_id1 users_id2 

1 -------- room1 ------- 1 --------- 2 
2 -------- room2 ------- 3 --------- 4 

我不知道该怎么办内连接。我究竟做错了什么?

感谢您的回答。

+0

哪里都是2'users_id'来自哪里?你的查询限制了在'clsown'和'u1'中这些字段必须相等的地方,所以我很困惑你想让它们与众不同。 – 2013-03-26 15:46:30

+0

https://www.dropbox.com/s/jhiftrhrt0i0a9w/kkk.JPG – Harajukuzz 2013-03-26 16:34:35

+0

@Harajukuzz你只有2个用户?你使用的是什么RDBMS? – Taryn 2013-03-26 17:08:30

回答

0

由于您使用的SQL Server有几个方法,你可以支点的数据。

可以使用聚合函数与CASE表达:

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; 

或者你可以使用PIVOT功能:

select cls_id, 
    cls_name, 
    user_id1, 
    user_id2 
from 
(
    SELECT cr .cls_id, 
     cr.cls_name, 
     u1.users_id, 
     'user_id'+cast(ROW_NUMBER() over(partition by cr.cls_id order by u1.users_id) as varchar2)) col 
    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 
pivot 
(
    max(users_id) 
    for col in (user_id1, user_id2) 
) piv; 
+0

thx你这么多^^ – Harajukuzz 2013-03-26 18:15:52

+0

@Harajukuzz不客气! :) – Taryn 2013-03-26 18:16:26

+0

如何where users_id1 = 1或users_id2 = 1 – Harajukuzz 2013-03-27 13:37:54

1

您在此处记录的查询实际上需要一个数据透视表,因为您希望为cls_id和cls_name获取唯一值,然后将用户排序为列。

早在2009年,我写了this article,它显示了如何做这样的事情。它应该帮助

0

我假设你正在使用Mysql为您RDBMS,如果是的话,你可以利用GROUP_CONCAT()显示records按您need,但以不同的形式。即]这个查询会将你想要的所有额外的coloumns填入由separator分隔的单个cell中。

SELECT classroom .cls_id, 
     classroom.cls_name, 
     GROUP_CONCAT(u1.users_id ORDER BY u1.users_id SEPARATOR ', ') Users 
FROM classroom 
     INNER JOIN clsown 
       ON clsown.cls_id = classroom .cls_id 
     INNER JOIN users AS u1 
       ON clsown.users_id = u1.users_id 
     Group by classroom .cls_id 

上面的查询将返回的记录,像下面,

cls_id cls_name users 

    1  room1  1,2 

    2  room2  3,4 

编辑:Reference for achieving the above result in Sql server