我有一對需要加入的表,我想回傳 tableA、tableB 或兩者中的任何記錄。我想我需要一個 FULL OUTER JOIN
此查詢回傳 1164 條記錄
SELECT name FROM tableA
WHERE reportDay = '2022-Apr-05'
而這一項回傳 3339 條記錄
SELECT name FROM tableB
WHERE reportDay = '2022-Apr-05'
而這個回傳 3369 條記錄(因此 tableA 中必須有 30 條記錄不在 tableB 中)
select distinct name FROM tableA where reportDay = '2022-Apr-05'
union distinct
select distinct name FROM tableB where reportDay = '2022-Apr-05'
我想獲取任一表中所有匹配記錄的串列。上面的查詢回傳 3369 條記錄,因此 FULL OUTER JOIN 也應該回傳 3369 行(我認為)。到目前為止,我的最大努力如下所示。它回傳 1164 行并回傳在我看來是 tableA 和 tableB 之間的左連接。
SELECT tableA.name.*, tableB.name.*
FROM tableA
FULL OUTER JOIN tableB
ON (tableA.name = tableB.name and tableB.reportDay = '2022-Apr-05')
WHERE tableA.reportDay = '2022-Apr-05'
幫助表示贊賞。(如果這個問題看起來很熟悉,這是這個問題的后續問題)
更新 - 一些資料來幫助....
DROP TABLE tableA;
DROP TABLE tableB;
CREATE TABLE tableA (
name VARCHAR(10),
reportDay DATE,
val1 INTEGER,
val2 INTEGER
);
CREATE TABLE tableB (
name VARCHAR(10),
reportDay DATE,
test1 INTEGER,
test2 INTEGER
);
INSERT INTO tableA values
('A','2022-Apr-05',1,2),
('B','2022-Apr-05',3,4),
('C','2022-Apr-05',5,6),
('Z','2022-Apr-06',5,6)
INSERT INTO tableB values
('B','2022-Apr-05',11,22),
('C','2022-Apr-05',33,44),
('D','2022-Apr-05',55,66),
('Q','2022-Apr-06',5,6)
SELECT tableA.*, tableB.*
FROM tableA
FULL OUTER JOIN tableB
ON (tableA.name = tableB.name and tableB.reportDay = '2022-Apr-05'
AND tableA.reportDay = '2022-Apr-05' )
對于這些資料,我希望僅從表 A 中看到 4 行資料“A”,從兩個表中看到“B”和“C”,僅從表 B 中看到“D”。
uj5u.com熱心網友回復:
日期的條件應放在一個WHERE子句中:
SELECT a.*, b.*
FROM tableA a FULL OUTER JOIN tableB b
ON b.name = a.name
WHERE '2022-Apr-05' IN (a.reportDay, b.reportDay);
或者:
SELECT a.*, b.*
FROM tableA a FULL OUTER JOIN tableB b
ON b.name = a.name
WHERE (a.reportDay = '2022-Apr-05' OR a.reportDay IS NULL)
AND (b.reportDay = '2022-Apr-05' OR b.reportDay IS NULL);
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/457822.html
標籤:sql PostgreSQL
上一篇:SQL查詢查找所有用戶,用戶'A'跟隨,然后檢查另一個用戶'B'是否也跟隨相同的用戶
下一篇:修復SQL子查詢回傳多行
