我正在使用Oracle。需要幫助找到一個表中的值並且不存在於另一個表中,反之亦然
我有2個表,每個表都有一個用戶ID和權利ID。我想選擇表1中存在的權利,但不是表2中的權利,反之亦然。我需要的輸出如下所示:
USER_ID| ENTITLEMENT_1 | ENTITLEMENT_2
33 | 44 | <NULL>
54 | <NULL>| 55
33 | <NULL>| 32
我正在使用Oracle。需要幫助找到一個表中的值並且不存在於另一個表中,反之亦然
我有2個表,每個表都有一個用戶ID和權利ID。我想選擇表1中存在的權利,但不是表2中的權利,反之亦然。我需要的輸出如下所示:
USER_ID| ENTITLEMENT_1 | ENTITLEMENT_2
33 | 44 | <NULL>
54 | <NULL>| 55
33 | <NULL>| 32
這應該爲你工作:
SELECT * FROM Table1 t1
LEFT JOIN
(SELECT userID FROM Table2)
AS t2 ON t1.userID=t2.userID
這不只是一個簡單的外部連接,如果你正在尋找只爲那些存在於一張桌子上而不是另一張桌子上的權利。
SELECT t1.userid, t1.entitlement_1, NULL AS entitlement_2
FROM table1 t1
WHERE NOT EXISTS (SELECT 1 FROM table2 t2
WHERE t2.userid = t1.userid
AND t2.entitlement_2 = t1.entitlement_1)
UNION ALL
SELECT t2.userid, NULL AS entitlement_1, entitlement_2
FROM table2 t2
WHERE NOT EXISTS (SELECT 1 FROM table1 t1
WHERE t1.userid = t2.userid
AND t1.entitlement_1 = t1.entitlement_2)
第一個select會查找table2中不存在的userid和entitlement_1對,第二個select會做相反的操作。你沒有提供關於所涉及的表的很多信息,例如,如果userid或(userid,entitlement)是主鍵或任何東西,所以這可能能夠被優化。
no,兩個表都沒有主鍵;事實上,這是我正在做的一個更大的查詢的一部分。 但還有一個問題;在table1中的權利的形式是「*/*/fis/<權利id>」你知道我將如何過濾,所以我只是得到權利ID比較table2權利ID – user652778
你將不得不提取id,可能使用'SUBSTR'或'REGEXP_SUBSTR',如'SUBSTR(t1.entitlement_1,9)= t2.entitlement_2'(或其他)。請注意,如果您在t1.entitlement列上有任何此類功能,那麼使用這樣的功能將會繞過索引,並且會降低查詢速度。 – eaolson
如何從table2檢索授權2? – eaolson
當你使用SELECT *和JOIN時,結果包含ON子句中引用的所有表中的所有列 – Rucia
哦,geez,我完全沒有注意到* – eaolson