我有 2 個表,我想查詢和顯示資料差異:
CREATE TABLE order_splits_config (
id INT,
pair_id INT
);
CREATE TABLE active_pairs (
id INT,
pair VARCHAR(30),
exchange_active boolean,
exchange_id INT
);
INSERT INTO order_splits_config(id, pair_id)
VALUES (1, 83);
INSERT INTO order_splits_config(id, pair_id)
VALUES (2, 58);
INSERT INTO order_splits_config(id, pair_id)
VALUES (34, 34);
INSERT INTO active_pairs(id, pair, exchange_active, exchange_id)
VALUES (1, 'US/EN', true, 2);
INSERT INTO active_pairs(id, pair, exchange_active, exchange_id)
VALUES (2, 'GB/UK', true, 3);
INSERT INTO active_pairs(id, pair, exchange_active, exchange_id)
VALUES (2, 'FR/EU', true, 4);
我使用這個查詢來查詢差異:
SELECT b.id, b.pair, b.exchange_id
FROM order_splits_config a
FULL OUTER JOIN active_pairs b
ON a.pair_id = b.id
WHERE a.pair_id IS NULL
OR b.id IS NULL
AND b.exchange_active = 'true';
例如,這會列印很多這樣的行(資料只是示例):
#,pair,id,exchange_id
1, US/EN,332,1
2, GB/UK,112,1
3, GB/UK,113,1
4, FR/EU,221,5
5, FR/EU,183,2
...
我如何使用DISTINCT才能從唯一的查詢中獲取結果pair?
小提琴:https ://www.db-fiddle.com/f/4D6VfqysPCWhQnh8zaFBps/2
uj5u.com熱心網友回復:
您只需從表中選擇列active_pairs開始。
加入 on 后a.pair_id = b.id,a.pair_id IS NULL只有在表中沒有匹配的行時,條件才為真order_splits_config AS a,這更有效地表述為NOT EXISTS而不是FULL JOIN.
至于b.id IS NULL AND b.exchange_active = 'true': 再次,b.id只能NULL用于a找不到匹配項的行b- 在這種情況下b.exchange_active永遠不會為真。因此,該子句有效地消除了a剛剛添加的所有行,FULL JOIN并且這些行將在結果中顯示為所有 NULL 值,因為只有來自b. 簡而言之:不要FULL JOIN開始。
如果active_pairs.pair已定義UNIQUE,則歸結為:
SELECT id, pair, exchange_id
FROM active_pairs b
WHERE NOT EXISTS (SELECT FROM order_splits_config a WHERE a.pair_id = b.id);
如果active_pairs.pair未定義UNIQUE,簡單的解決方案是DISTINCT ON:
SELECT DISTINCT ON (pair)
id, pair, exchange_id
FROM active_pairs b
WHERE NOT EXISTS (SELECT FROM order_splits_config a WHERE a.pair_id = b.id);
db<>在這里擺弄
從 上的每組重復項中pair,您可以任意選擇。
對于確定性選擇,定義要選擇的內容并相應地添加ORDER BY子句。示例:要獲得最小的id,請添加:
...
ORDER BY pair, id;
還將排序順序添加到迄今為止未排序的結果中。
如果order_splits_config不是很小,請使用索引(pair_id)以使其快速。
可能有很多更快的解決方案為一個大active_pairs表,根據未公開的資訊,列的多為基數pair(多少重復的值)。
看:
- 選擇每個 GROUP BY 組中的第一行?
- 選擇其他表中不存在的行
- 優化 GROUP BY 查詢以檢索每個用戶的最新行
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/313939.html
標籤:sql PostgreSQL 重复 postgresql-13
下一篇:如果不存在,如何創建函式?
