Postgresql

如何從表 A 中選擇與表 B 中某列的所有項目一起出現的特定項目?

  • October 31, 2018

我有 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,根據您的問題數據顯示我的解決方案。

查看 SQL 小提琴

引用自:https://dba.stackexchange.com/questions/218356