2014-02-28 52 views
3

我有兩個表加入兩個表的連接

Table: color_document 
+----------+---------------------+ 
| color_id | document_id  | 
+----------+---------------------+ 
| 180907 | 4270851    | 
| 180954 | 4270851    | 
+----------+---------------------+ 

Table: color_group 
+----------------+-----------+ 
| color_group_id | color_id | 
+----------------+-----------+ 
|    3 | 180954 | 
|    4 | 180907 | 
|    11 | 180907 | 
|    11 | 180984 | 
|    12 | 180907 | 
|    12 | 180954 | 
+----------------+-----------+ 

是否有可能爲一個查詢得到的結果看起來像這樣使用多個顏色標識的加入兩個表?

Result 
+----------------+--------------+ 
| color_group_id | document_id | 
+----------------+--------------+ 
|    12 | 4270851  | 
+----------------+--------------+ 

由於顏色組12是唯一具有與文檔4270851相同的顏色集合的組。

我已經得到了我被強行與所以我不得不努力通過找出每個組獨特的與DOCUMENT_ID的相關COLOR_ID的的製造色組一些不好的數據。我試圖直接在我製造的顏色組和文檔之間建立新的關係。

我知道我大概可以用GROUP_CONCAT做一些事情來製作連接的顏色ID的僞關鍵字,但我試圖找到一個解決方案,也可以在Oracle中工作。我用這種邏輯吠叫完全錯誤的樹嗎?

我的最終目標是能夠有一個單獨的行中,將代表任何數量的與文檔相關的出口到一個完全不同的系統,一個比我正在使用顏色的表。

有什麼想法/意見/建議高度讚賞。

預先感謝您看我的問題。

+0

你想要什麼叫做(精確)** [關係司(http://en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29) **。看到這篇文章:** [Divided We Stand:關係部門的SQL](https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-關係劃分/)** –

+1

另請參閱此問題,以解決類似問題的可能方法:** [如何篩選具有多對一關係的SQL結果](http://stackoverflow.com/questions/ 7364969/how-to-filter-sql-results-in-a-many-through-relation)** –

+0

你想爲特定的'document_id'還是爲它們全部? –

回答

3

執行兩個表的正常連接,並計算每個配對的行數。然後測試這是否與每個項目出現在原始表格中的次數相同。如果全部相同,則所有顏色ID必須匹配。

SELECT a.color_group_id, a.document_id 
FROM (
    SELECT color_group_id, document_id, COUNT(*) ct 
    FROM color_document d 
    JOIN color_group g ON d.color_id = g.color_id 
    GROUP BY color_group_id, document_id) a 
JOIN (
    SELECT color_group_id, COUNT(*) ct 
    FROM color_group 
    GROUP BY color_group_id) b 
ON a.color_group_id = b.color_group_id and a.ct = b.ct 
JOIN (
    SELECT document_id, COUNT(*) ct 
    FROM color_document 
    GROUP BY document_id) c 
ON a.document_id = c.document_id and a.ct = c.ct 

SQLFIDDLE

+0

我唯一要添加到此答案的是,對兩者都有唯一的約束是個好主意'(color_group_id,color_id)'和'(color_id,document_id)',或[這可能發生](http://sqlfiddle.com/#!2/24fc27/1)。 – Air

+0

這看起來會讓我得到我需要的東西!至少從幾個測試場景中,還沒有針對完整的數據集運行它。謝謝@Bamar和其他所有發佈回覆的人! – copaX

-1

如果我明白你的問題正確的,你只需要連接兩個表,然後組的結果通過color_group_id的DOCUMENT_ID。

SQL Fiddle

select color_group_id, document_id 
from 
    color_document cd join 
    color_group cg 
    on cd.color_id = cg.color_id 
group by color_group_id, document_id 

該查詢會給你這樣的結果集:

COLOR_GROUP_ID DOCUMENT_ID 
3    4270851 
4    4270851 
11    4270851 
12    4270851 

這是你想要的嗎?

+1

文檔4270851有兩個顏色ID,但顏色組ID 3,4和11只有其中一個,所以它們不應該在結果中。 – Barmar

+0

然後只需在組下加一個HAVING COUNT(*)> 1;) – Matze

+0

這還不夠。如果其中一個有2個顏色ID而另一個有3個,會怎麼樣?需要檢查的數量是相同的,而不只是一個。 – Barmar