我必須將TABLE1中的每條記錄與TABLE2中的最多1條記錄進行匹配。 有一個更好的方法來匹配(CODE相等)和一個窮人(在沒有CODE相等的情況下,讓我們按CODE排序並按索引匹配)。加入已批准的標準嗎?
讓我們假設作爲第一近似,該代碼這樣做可能是這樣的:
SELECT
TABLE1.CODE AS CODE1,
TABLE2.CODE AS CODE2
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY CODE) INDEX, CODE FROM TABLE1) T1
LEFT JOIN
(SELECT ROW_NUMBER() OVER(ORDER BY CODE) INDEX, CODE FROM TABLE2) T2
ON
(T1.CODE=T2.CODE) --CODE equality
OR
(T1.INDEX=T2.INDEX) --CODE equality
讓我們考慮這些表:
TABLE1 TABLE2
+------+ +------+
| CODE | | CODE |
+------+ +------+
| AAA | | BBB |
| BBB | | CCC |
| CCC | | DDD |
+------+ +------+
結果將是:
CODE1 CODE2
----- -----
AAA BBB -> matched because of INDEX equality
BBB BBB -> matched because of CODE equality
BBB CCC -> matched because of INDEX equality
CCC CCC -> matched because of CODE equality
CCC DDD -> matched because of INDEX equality
難度:我想表達這樣一個觀點,儘管有兩種匹配條件如果可能,第一個必須優先於第二個,並且第二個必須評估當且僅當第一個失敗時。
的通緝的結果是:
CODE1 CODE2
----- -----
AAA DDD -> matched because of INDEX equality between the cast-off records not able to match better
(corrected from the previous version where AAA was said to match expectedly with BBB)
BBB BBB -> matched thanks to CODE equality, no need to match on INDEX
CCC CCC -> matched thanks to CODE equality, no need to match on INDEX
當然,我將優選獲得此行爲的所有功能於一身的查詢,以避免幾個步驟的腳本,因爲:
你可以隨意提出一個完全不同的問題:上面的問題只是爲了說明總體思路,但很明顯它不符合需求。所以,不需要嘗試保留它的結構。
與希望執行全功能於一身的查詢匹配相比,我並不在意性能。如果需要子查詢,讓我們開始吧! ;-)
渴望閱讀您的建議! :-)
編輯:
我改變了我的OP強大的錯誤,現在已經更正,深入改變什麼可以被看作是一個準確的答案。預期的結果是不正確的。我最謙卑的道歉。 :-(
這個想法是:儘可能地匹配CODE相等,然後只考慮那些被第一個匹配算法留下的匹配它們的索引,這就是爲什麼AAA錯誤地被期望INDEX-與BBB(已與另一個BBB進行CODE匹配)相匹配,必須事實上與其他非CODE匹配項目INDEX匹配,在這種情況下,DDD。
您的第二個子查詢應該針對Table2而不是Table1? –
對不起,當然是。我糾正了OP。 – Ssithra
@Sithithra:這兩個字段'CODE'是否有一個UNIQUE約束? –