2010-06-30 277 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