2016-08-18 106 views
3

我基本上試圖根據tableB中的信息加入tableA中的單個記錄。如果我得到多個結果與原始連接條件,然後我添加更多並重新運行查詢。如果我沒有得到結果,那麼沒有任何轉移。例如:搜索a.FRST_NM = b.FRST_NM。如果有一個結果,拉出記錄。如果多於一個,則添加LAST_NM,如果有一個結果,則拉出該記錄。等等,直到我有一個記錄。我一次只能做一次,但每次都會發生2到3次。運行搜索以識別成員

這是因爲有些字段沒有填充在一個表中,而是在另一個表中。我只是不知道如何在不改寫整個FROM聲明的情況下添加聯接條件,或者如果只有一個結果,那麼該如何提取記錄。

IF(CONDITION_1 from JOIN_1) = 1 result THEN a.field_1 = b.field_1 and a.field_2 = b.field_2 

IF (CONDITION_1 from JOIN_1) > 1 result THEN (additional joining conditions + JOIN_1) as JOIN_1a 

ELSE IF(CONDITION_1 from JOIN_1a) = 1 result then a.field_1 = b.field_1 and a.field_2 = b.field_2 

IF(CONDITION_1 from JOIN_1) = 0 results then NO MOVE 

--(Repeat with different tables and joining conditions)-- 

回答

1

嗯。一種方法是加入一個領域,然後根據其他領域優先考慮。另一個將使用left join。這將是這樣的:

select t1.*, coalesce(t2a.col, t2b.col, t2c.col) as col 
from t1 left join 
    t2 t2a 
    on t1.col1 = t2a.col1 and t1.col2 = t2a.col2 and t1.col3 = t2a.col3 left join 
    t2 t2b 
    on t1.col1 = t2b.col1 and t1.col2 = t2b.col2 and t2b.col1 is null left join 
    t2 t2c 
    on t1.col1 = t2c.col1 and t2b.col1 is null; 
1
SELECT * 
FROM (
    SELECT 
     * 
     ,CASE WHEN a.LAST_NM = b.LAST_NM THEN 'matched' ELSE 'not matched' END LastNameMatchedExample 
     ,ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY 
       CASE 
        WHEN a.LAST_NM = b.LAST_NM AND a.Field1 = b.Field1 AND a.Field2 = b.Field2 AND a.Field3 = b.Field3 THEN 0 
        WHEN a.LAST_NM = b.LAST_NM AND a.Field1 = b.Field1 AND a.Field2 = b.Field2 THEN 1 
        WHEN a.LAST_NM = b.LAST_NM AND a.Field1 = b.Field1 THEN 2 
        WHEN a.LAST_NM = b.LAST_NM THEN 3 
        ELSE 4 
       END 
      ) as RowNumber 
    FROM 
     TableA a 
     INNER JOIN TableB b 
     ON a.FIRST_NM = b.FIRST_NM 
    ) results 
WHERE 
    results.RowNumber = 1 

所以基本上它僅在First_NM條件,然後搜索的構造和列表以便允許您選擇基於如果這符合你想要的確切記錄,這匹配和這匹配等。所以無論有多少記錄返回,你可以得到第一個結果。因爲所有內容都來自同一個2表,所以應該始終保留所需的最多列數,如果不匹配,則可以使用CASE STATEMENTS將值設爲NULL。

下面是一個類似的方法,它將處理該字段的優先順序,但有點像OR條件與其他字段匹配。所以在這個例子中,它會根據匹配存在的情況進行排序等,並遍歷所有的語句。與上面不同的地方是說沒有LAST_NM匹配發生,但是在一個記錄上發生了field1匹配,並且在另一個記錄上它不會使得field1匹配更高的結果。

SELECT * 
FROM (
    SELECT 
     * 
     ,CASE WHEN a.LAST_NM = b.LAST_NM THEN 'matched' ELSE 'not matched' END LastNameMatchedExample 
     ,ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY 
       CASE WHEN a.LAST_NM = b.LAST_NM THEN 0 ELSE 1 END 
       ,CASE WHEN a.Field1 = b.Field1 THEN 0 ELSE 1 END 
       ,CASE WHEN a.Field2 = b.Field2 THEN 0 ELSE 1 END 
       ,CASE WHEN a.Field3 = b.Field3 THEN 0 ELSE 1 END 
      ) 
    FROM 
     TableA a 
     INNER JOIN TableB b 
     ON a.FIRST_NM = b.FIRST_NM 
    ) results 
WHERE 
    results.RowNumber = 1 
+0

因此,而不是改變加入條件,我會使CASE表達式呢?這聽起來更容易。特別是因爲在後面的過程中,一些表格被刪除,而其他表格被添加到它們的位置。 –

+0

這裏假設你想要搜索的所有表格都以LEFT JOIN開始,然後你只需通過創建一個row_number()優先級來選擇所需的記錄,以根據case語句設置優先級。但你仍然必須在開始時加入所有的表格...... – Matt

+0

這適用於第一遍,但後面的通行證讓我刪除表格並加入不同的表格,以便在結果> 1或= 0時運行。 –