簡體   English   中英

除非為空,否則如何基於一列聯接兩個表,在這種情況下,應基於兩個不同的列聯接

[英]How do you join two tables based on one column unless it's null, in which case join based on two different columns

因此,這令人困惑,但讓我們從下表開始:

 Table1           Table2
 ID1  |  ID2  ||  ID1  |  ID2
 -----------  ||  -----------
 jve  |  234  ||  jve  |  null
 null |  234  ||  dav  |  234
 rev  |  584  ||  rev  |  null
 null |  584  ||  ewj  |  584
 avv  |  442  ||  avv  |  null
 null |  442  ||  pol  |  442

*表格是為了便於理解而組織的,但實際上並非如此

我想做的是在T1.ID1 = T2.ID1上加入Table1和Table2。 但是,如果ID1恰好為空,那么我想在T1.ID2 = T2.ID2上加入它們,而不是第一種方法。

我對谷歌搜索的了解是

SELECT *
  FROM table1 t1
       INNER JOIN table2 t2
          ON (    t1.ID1 = COALESCE (t2.ID1, t1.ID1)
              AND t1.ID2 = COALESCE (t2.ID2, t1.ID2))
 WHERE ID2 = '234';

我要彈出的結果只是將上述表格橫向合並為:

Results
-------
jve  | 234 | jve | null
null | 234 | dav | 234
etc..

這樣做的原因是,我試圖在ID1以外的表1和表2之間對齊的列還有更多。

這里主要的困難是我不確定如何表達邏輯,

if( T1.ID1 == null )
{
   ON T1.ID2 = T2.ID2
}
else
{
   ON T1.ID1 = T2.ID1
}

進入SQL

如果需要更多信息,我會很樂意添加到我的帖子中。

我忘了包括,如果它以第一種方式加入,那以后就不應該以第二種方式加入。 我的意思是第一行 234應該加入jve | null,然后下一行,null | 應該抓住234,而不是加入jve。 234至dav | 234 ...如果有任何道理..

我需要使用一個方法或另一個方法來連接這兩個表,但絕不能同時使用這兩個表。

您的邏輯聽起來像ON子句中的OR條件:

SELECT *
FROM table1 t1 INNER JOIN
     table2 t2
     ON t1.ID1 = t2.ID1 OR
        (t1.ID1 IS NULL AND t1.ID2 = t2.ID2)
WHERE t1.ID2 = '234';

您可以對第二個表進行雙左聯接並應用COALESCE,因此它類似於

SELECT 
      t1.ID1,
      t1.ID2,
      COALESCE( t2a.ID1, t2b.ID1 ) as T2ID1,
      COALESCE( t2a.ID2, t2b.ID2 ) as T2ID2   
   FROM 
      table1 t1
         LEFT JOIN table2 t2a
            ON t1.ID1 = t2a.ID1
           AND NOT t1.ID1 IS NULL
         LEFT JOIN table2 t2b
            ON t1.ID2 = t2b.ID2
           AND t1.ID1 IS NULL
   WHERE 
      t1.ID2 = '234'

因此,如果第一個表T2A有一條記錄,它將分別從該行中提取值。 如果為null,則轉到該字段的T2B別名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM