【问题标题】:SQL query helpSQL查询帮助
【发布时间】:2010-07-02 02:00:50
【问题描述】:

很抱歉再次发布此问题。我稍微改述了我的问题。

我正在尝试编写一个查询以返回表 A 中的行,其中在表 B 中找到多行,表 A 中的每个 CID 列的 STATUS = 1。

所以在这个例子中,CID 100 在表 B 中有两条记录,并且 STATUS = 1。所以我想编写一个查询来从表 A 中返回这一行。我知道这是一个奇怪的桌子设计。请帮忙。

这是带有示例数据的表格。

Table-A

----------------------------------------- 
AID                Name          CID 
--------------------------------------- 
10               test1           100     
12               test1           100 
13               test2           101
14               test2           101
15               test3           102


Table-B 
------------------------------------ 
bID             AID          status
----------------------------------- 
1                 10             1
2                 12             1
3                 14             1
4                 15             1

【问题讨论】:

  • 你的措辞让我很困惑!
  • "我想写一个查询来返回表 A 中的这一行。"你刚才说有两行……当你说“这个”行时,你指的是这两行中的哪一行?
  • 我不会在你的表/列名中使用“-”,因为它在大多数数据库中都不起作用。请改用“_”(下划线)。

标签: sql


【解决方案1】:

试试这个查询:

SELECT TableA.CID
FROM TableA
JOIN TableB ON TableA.AID = TableB.AID
WHERE TableB.status = 1
GROUP BY TableA.CID
HAVING COUNT(*) > 1

它为您的示例数据返回 100

【讨论】:

  • 谢谢马克。有用。我想返回 TableA 中的所有列。所以我用 Select * from tableA where CID in(SELECT TableA.CID FROM TableA JOIN TableB ON TableA.AID = TableB.AID WHERE TableB.status = 1 GROUP BY TableA.CID HAVING COUNT(*) > 1 结束了这个查询
  • 你不能在 WHERE 子句中加入一个吗?我发现这更具可读性: select a.* from tableA a, tableB b where a.aid = b.aid and b.status = 1 group by a.cid with count(*) > 1 另外应该有一个 FK在表 B 中的 AID 字段上
  • @SWD:请参阅此相关问题:*.com/questions/1018822/…
【解决方案2】:

这样的?

select aid,
       status 
from (select aid,
             count(*) as cnt 
      from tableA 
      group by aid) as aggregated
left join tableB on tableB.aid = aggregated.aid 
where aggregated.cnt > 1

【讨论】:

    【解决方案3】:

    如果您使用 SQL:

    WITH tableBView AS
    (
        SELECT AID AS xxxAID
        FROM [Table-B]
        WHERE status = 1
        GROUP BY AID
        HAVING COUNT(*) > 0
    )
    SELECT *
    FROM [Table-A]
    WHERE EXISTS (SELECT * FROM tableBView WHERE xxxAID = AID)
    

    【讨论】:

      【解决方案4】:
      SELECT * 
      FROM Table-A a 
      WHERE a.CID IN
          (
          SELECT a.CID FROM Table-A a JOIN Table-B b USING (AID) 
          GROUP BY a.CID
          WHERE b.status = 1
          HAVING count(*) > 1
          )
      

      【讨论】:

        【解决方案5】:

        这是一种非常冗长的方法。

        Table-A 中选择 AIDTable-ATable-B 之间匹配的行上的所有列> 并且 Table-A 中存在多行具有相同 CID 的行: (顺便说一句,我不会在您的表/列名中使用“-”。改用“_”。)

        select
         derived_table.AID,
         derived_table.Name,
         derived_table.CID
        from
        (select
          table_A.AID,
          table_A.Name,
          table_A.CID,
          count(table_A.CID) c
         from
          Table_A
          inner join Table_B on (Table_A.AID = table_B.AID)
         group by table_A.CID
        ) derived_table
        where
          c > 1
        

        【讨论】: