2012-02-23 145 views
3

我有兩個表A和波段B A之間的關係是A --->一對許多--->乙SQL查詢的兩個與關係表一個一對多

通常情況下,我有對於A的每個記錄B的一個記錄

我想編寫一個查詢,這將使我的ONLY記錄的其中有超過ONE(多)結果名單B.

我很困惑,因爲我只做了基本的SQL查詢,這對我來說似乎很複雜。

有人請指導我正確的答案或給我的解決方案。

編輯:

確定我想是這樣的下方,它給我一個錯誤

SELECT SOME_COLUMN_NAME從一個,B b,其中a.ID = b.ID和計數(b.SOME_OTHER_COLUMN_NAME)> 1;

ORA-00934:組函數是不是在這裏

我試圖在互聯網上的廣告搜索允許我不允許使用WHERE子句中的分組,並應通過使用具有去。我現在被困在這裏。

回答

4

的數據庫系統使用的是(SQL服務器/ MySQL的/ SQLite的/ ORACLE等)您還沒有指定,所以這是一個通用的答案。

在這種形式中,在SELECT和GROUP BY子句中明確列出A的所有列。它通常在大多數數據庫管理系統中生成一個很好的直接計劃。但是如果類型不是GROUP-able,它也可能失敗,比如SQL Server中的TEXT列。

SELECT A.Col1, A.Col2, A.Col3 
FROM A 
JOIN B ON A.LinkID = B.LinkID 
GROUP BY A.Col1, A.Col2, A.Col3 
HAVING COUNT(*) > 1 

使用子查詢該另一形式適用於任何列類型A和通常產生完全相同的計劃。

SELECT A.Col1, A.Col2, A.Col3 
FROM A 
WHERE 1 < (
    SELECT COUNT(*) 
    FROM B 
    WHERE A.LinkID = B.LinkID) 
+0

這在技術上是正確的,但是如果您在A中有很多列,它會變得非常混亂。如果您在結果中需要A中的所有列,那是隻需按ID列進行分組,然後將A與子查詢結合使用即可。 – 2012-02-23 20:21:54

0

你可以用一個子查詢做到這一點:

select * 
    from A 
    where (select count(*) from B where B.id = A.id) > 1 
+0

這是可行的,但是你並不想就這樣做在生產系統中使用大表。您在A中的每一行都有效地執行了子選擇。 – 2012-02-23 20:27:39

0
select * 
from tableA 
where Id in (select IdA from tableb group by idA having COUNT(*)>1) 

假設tableB的有一個叫做艾達場,它鏈接到TABLEA

相關問題