【问题标题】:selecting from multiple tables从多个表中选择
【发布时间】:2012-04-26 07:09:15
【问题描述】:

表 B,表 c。

表 A 有 ID,col1

ID    COL1
1      abc
2      bcd

表 B 有 col2, col3

col2 col3
bcc  abc
acc  bcd

表 C 有 ID,col4

ID col3
1   qwe
1   tre
1   uid
2   jkj
2   jwekj

现在,我需要选择 ID、COL1、COL2、计数(表 C 中的 ID)。示例输出将是

ID  COL1  COL2  CNT
1   abc   bcc    3
2   bcd   acc    2

有人可以帮我吗?表 A 和 B 使用 COl1 和 COL3 连接。

【问题讨论】:

  • 你用的是什么版本的sql-server?

标签: sql sql-server sql-server-2008 select


【解决方案1】:

你为什么不通过ID加入表A和表C并获得计数?

SELECT TableA.ID, TableA.COL1, TableB.COL2, COUNT(TableC.*)
FROM TableA
INNER JOIN TableB ON TableB.COL3 = TableA.COL1
INNER JOIN TableC ON TableC.ID = TableA.ID
GROUP BY TableA.ID, TableA.COL1, TableB.COL2
ORDER BY TableA.ID, TableA.COL1, TableB.Col2

【讨论】:

    【解决方案2】:
    select  a.id
    ,       max(a.col1)
    ,       avg(b.col2)
    ,       count(distinct c.ID)
    from    TableA a
    join    TableA b
    on      a.col1 = b.col3
    left join
            TableC c
    on      c.id = a.id
    group by
            a.id
    

    【讨论】:

    • 只能通过id列分组得到吗?
    • 看看@Arion 的回答
    • 表A中的所有ID都不需要出现在表C中。所以我需要从表中获取所有值。如果表 C 中不存在该 ID,则该计数应为 0。只有在这里我无法得到它。我尝试使用左外连接。但是仅按 ID 分组让我感到困惑。
    • 已编辑,因此仅按 ID 分组,但这意味着您必须将其他列放在聚合函数中,例如 min 或 max 或 avg
    【解决方案3】:
    select A.ID, A.Col1, B.Col2, Count(*) AS Cnt 
    from A
    inner join B ON B.Col3 = A.Col1
    left join C ON C.ID = A.ID
    Group By A.ID, A.Col1, B.Col2
    

    【讨论】:

      【解决方案4】:
      SELECT A.ID, A.COL1, B.COL2, (SELECT COUNT(C.ID) FROM C) AS CNT
      FROM A INNER JOIN B ON A.COL1=B.COL3 
      

      【讨论】:

        【解决方案5】:

        可能是这样的:

        SELECT
            TableA.COL1,
            TableB.col2,
            (
                SELECT
                    COUNT(*)
                FROM
                    TableC
                WHERE
                    TableC.ID=TableA.ID
            )
        FROM
            TableA
            JOIN TableB
                ON TableA.COL1=TableB.col3
        

        【讨论】:

          【解决方案6】:
          Select 
              a.Id, a.col1, b.col2, count(c.*) As Cnt
          From A as a
          Inner Join B as b on a.col1 = b.col3
          Inner Join C as c on a.Id    = c.Id
          Group By a.Id, a.col1, b.col2
          

          【讨论】:

            【解决方案7】:
            declare @A  table(ID int, col1 varchar(50))
            declare @B  table(col2 varchar(50), col3 varchar(50))
            declare @C  table(ID int, col4 varchar(50))
            
            INSERT INTO @A(ID, col1) values(1, 'abc')
            INSERT INTO @A(ID, col1) values(2, 'bcd')
            
            INSERT INTO @B(col2, col3) values('bcc'  , 'abc')
            INSERT INTO @B(col2, col3) values('acc'  , 'bcd')
            
            INSERT INTO @C(ID, col4) values('1'  , 'qwe')
            INSERT INTO @C(ID, col4) values('1'  , 'tre')
            INSERT INTO @C(ID, col4) values('1'  , 'uid')
            INSERT INTO @C(ID, col4) values('2'  , 'jkj')
            INSERT INTO @C(ID, col4) values('2'  , 'jwekj')
            
            
            -- The query
            SELECT a.ID, a.col1, b.col2, (SELECT COUNT(c.ID) FROM @C c WHERE c.ID = a.ID) CNT
            FROM @A a join @b b ON a.col1 = b.col3
            

            【讨论】:

              【解决方案8】:
              select A.iD, A.Col1,B.col2, 
                     (select count(*) from tableC C where C.id=A.ID) as cnt
              from tableA A join tableB B on A.col1=b.col3
              

              【讨论】:

                猜你喜欢
                • 2019-03-05
                • 1970-01-01
                • 2011-02-16
                • 2021-11-08
                • 2014-01-12
                • 2011-02-01
                • 2010-10-11
                • 2021-03-19
                • 2010-10-01
                相关资源
                最近更新 更多