Postgresql
如何從表 A 中選擇與表 B 中某列的所有項目一起出現的特定項目?
我有 2 個具有以下模式的表:
t1(id, type)
其中 id 和 type 是主鍵
t2(type, rate)
其中 type 是主鍵我想找到所有出現在 t2 中的所有類型的 id。
例如給定表格:
t1
:id | type --------- 1 | a 1 | b 1 | c 2 | a 2 | b
和
t2
:type | rate ----------- a | 100 b | 100 c | 200
我們可以看到 t2 中有 3 個唯一類型,並且只有 t1 中的 id 2 出現在所有這些類型中。
我想出了一種獲取 id 的方法,方法是計算唯一類型的數量,然後按 id 對 t1 進行分組,並只選擇那些計數等於 t2 中類型總數的那些。
但我想知道是否還有其他邏輯結構,如
in/not in
,exists
或笛卡爾積也可以在這裡更優雅地使用?
我不知道 postgresql 但不應該以下工作嗎?
select id from t1 join t2 on t1.type = t2.type group by id having count(1) = (select count(1) from t2)
您正在選擇 ID 值。
這
join
意味著 t1 上的類型值必須存在於 t2 中。(我注意到您沒有明確聲明那裡存在外鍵關係 - 因此進行此連接,以避免出現以下情況:例如,對於給定的 ID 值,您在 t1 中具有三個不同的類型值,但它們不是相同的三個不同的在 t2 中鍵入值)。我們使用
group by
的原因有兩個:首先,這意味著每個 ID 在輸出中只會收到 1 行,但更重要的是,這允許我們使用聚合count
函式。該
count
函式本質上計算給定 ID 值(給定group by
子句)的行數,我們說行數必須與 t2 中的行數匹配。我們可以簡單地保留它,因為type
- 我們感興趣的列 - 在 t2 中,是一個關鍵列,因此在每一行中都是唯一的。想知道我是否錯過了什麼,在我對 postgresql 的無知中?
編輯:對我來說似乎工作正常。我已使用此處另一個答案中的設置 SQL 來創建一個 SQL Fiddle,根據您的問題數據顯示我的解決方案。