【问题标题】:select inner join table id vb选择内部连接表 id vb
【发布时间】:2013-03-16 11:54:35
【问题描述】:

我第一次用这个。

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

我不知道如何进行内部连接。我做错了什么?

感谢您的回答。

【问题讨论】:

  • 这 2 个 users_id 来自哪里?您的查询限制了 clsownu1 中这些字段必须相等的位置,所以我很困惑您希望它们如何不同。
  • @Harajukuzz 你只有两个用户吗?您使用的是什么 RDBMS?
  • @bluefeet 是的 cls_id 有 2 个用户

标签: sql vb.net sql-server-2008 pivot inner-join


【解决方案1】:

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

我在 2009 年写了 this article 来展示如何做这样的事情。应该有帮助

【讨论】:

    【解决方案2】:

    由于您使用的是 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;
    

    【讨论】:

    【解决方案3】:

    我假设您使用Mysql 作为您的RDBMS,如果是这样,您可以使用GROUP_CONCAT() 来按照您的need 显示records,但形式不同。即] 此查询会将您想要的所有其他 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 2019-08-21
      • 2021-03-16
      • 1970-01-01
      相关资源
      最近更新 更多