我有兩個相似的欄位表:
table_1:
field_1, field_2, field_3, field_4
table_2:
field_1, field_2, field_3, field_4
這里field_1可以用作外鍵來連接兩個表。
我想從中獲取所有行,table_1并且table_2至少有一行在table_1但超過一行table_2,反之亦然。
到目前為止,我已經嘗試了這些相關的解決方案:
- https://dba.stackexchange.com/questions/144313/how-do-i-find-mismatches-in-two-tables
- 比較兩個表,找到缺失的行和不匹配的資料。
uj5u.com熱心網友回復:
假設兩個表具有相同的行型別:所有相同的列名和型別(至少兼容),您可以使用行型別來簡化:
SELECT (t).*
FROM (SELECT t, count(*) AS ct1 FROM table_1 t GROUP BY 1) t1
JOIN (SELECT t, count(*) AS ct2 FROM table_2 t GROUP BY 1) t2 USING (t)
WHERE t1.ct1 > 1
OR t2.ct2 > 1;
- 將重復項分組并記住每個表中的計數。
- 連接兩個表,洗掉另一個表中沒有匹配的所有行。
- 過濾至少一側有多個副本的行。
- 在外部
SELECT分解行型別以像往常一樣獲取列。
我不回傳行數。如果您需要這些,請在外部添加ct1和。ct2SELECT
這要求每個列型別都支持相等運算子=。
一個突出的例子是json。(但jsonb確實如此。)見:
- 如何查詢空物件的json列?
如果您有這樣的列,請強制轉換text為解決它。或者您可以使用哈希值 - 這也有助于非常寬的行和/或許多重復的性能。有關的:
- 為什么我的 UNIQUE 約束沒有觸發?
uj5u.com熱心網友回復:
從 table_1 中獲取在 table_2 中有多個匹配記錄的所有記錄的一種方法是計算子查詢中匹配記錄的數量,并在其上放置條件:
SELECT *
FROM table_1 t1
WHERE (SELECT count(*)
FROM table_2 t2
WHERE t1.field_1 = t2.field_1) > 1
如果您希望在一個查詢中同時擁有這兩個方面,您可以將它們與 UNION 結合起來:
SELECT *
FROM table_1 t1
WHERE (SELECT count(*)
FROM table_2 t2
WHERE t1.field_1 = t2.field_1) > 1
UNION
SELECT *
FROM table_2 t2
WHERE (SELECT count(*)
FROM table_1 t1
WHERE t1.field_1 = t2.field_1) > 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/328336.html
標籤:sql PostgreSQL 加入 重复
上一篇:針對自身的過濾版本加入資料幀
