2010-06-30 147 views
2

对不起,再次发布此问题。我稍微改了一下我的问题。SQL查询帮助

我正试图编写一个查询来从Table-A返回行,其中Table-B中有多个行,Table-A中的每个CID列的STATUS = 1。

所以在这个例子中,CID 100在Table-B和STATUS = 1中有两条记录。所以我想写一个查询来从Table-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 
+1

数据库类型和版本? – 2010-06-30 22:48:25

+1

你的措辞让我很困惑! – JohnB 2010-06-30 22:49:57

+0

“我想写一个查询来从Table-A返回这一行。”你刚才说有两行......当你说'这一行'时,你指的是哪两行? – 2010-06-30 22:52:24

回答

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您的示例数据。

+0

谢谢马克。有用。我想返回TableA中的所有列。所以,我从TABLEA包裹起来这个查询与 选择*,其中在CID(SELECT TableA.CID FROM表A JOIN表B ON TableA.AID = TableB.AID WHERE TableB.status = 1 GROUP BY TableA.CID HAVING COUNT (*)> 1) – nav100 2010-06-30 23:33:59

+0

你不能只在WHERE子句中进行连接吗?我发现这样更具可读性:从tableA a,tableB b选择a *,其中a.aid = b.aid和b.status = 1 group by a.cid具有count(*)> 1 还应该有一个FK在表B中的AID字段中 – SWD 2010-07-01 17:01:28

+0

@SWD:请参阅以下相关问题:http://stackoverflow.com/questions/1018822/inner-join-versus-where-clause-any-difference – 2010-07-01 17:58:35

0

是这样的吗?

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 
0

如果您使用的是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) 
0
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 
    ) 
0

这是一个非常详细的方式来做到这一点。

选择所有列从表-A上的行其中AID表-A表-B和行匹配之间多于一个具有相同CID表-A存在: (顺便说一句,我不会用 “ - ” 你的表/列名称使用 “_” 代替。)

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