簡體   English   中英

SQL select將兩列合並為一列

[英]SQL select merge two columns into one

我有四張桌子:

表A:

ID | B_ID
----------
 1 |  5
 2 |  6
 3 |  7
 4 |  8

表B:

B_ID
-----
 5
 6
 7
 8

表C:

C_ID | C_Name
--------------
 5   | Alpha
 6   | Beta

表D:

D_ID | D_Name
--------------
 7   | Delta
 8   | Gamma

注意,表B中的值可以來自表C或表D.

我現在需要一個顯示表A中ID的查詢和一個名為Name的第二列,它由基於表B的B_ID列的相應名稱組成。

預期結果應如下所示:

ID | Name
----------
 1 |  Alpha
 2 |  Beta
 3 |  Delta
 4 |  Gamma

我試過的是這個查詢:

SELECT *
FROM B
LEFT OUTER JOIN C
ON B_ID = C_ID
LEFT OUTER JOIN D
ON B_ID = D_ID

這會產生:

B_ID | C_ID  | C_Name | D_ID | D_Name
-------------------------------------
 5   |  5    | Alpha  | Null | Null
 6   |  6    | Beta   | Null | Null
 7   |  Null | Null   | Null | Delta
 8   |  Null | Null   | Null | Gamma

但是,我還有兩個問題:

  1. 我需要將名稱合並為一個列(請參閱上面的預期結果)
  2. 它需要是基於表A的SELECT子查詢才能顯示表A的ID列。

這是使用帶有union all的子查詢的一個選項:

select a.id, b.name
from tablea a
   join (select id, name from tablec 
         union all select id, name from tabled) b on a.B_ID = b.id

您可以將*替換為您想要的表達式

SELECT B.B_ID
     , COAELESCE(C.C_NAME,D.D_NAME) AS `Name`

在表A中添加連接並不難......

SELECT A.A_ID                       AS `Id`
     , COAELESCE(C.C_NAME,D.D_NAME) AS `Name`
  FROM A
  LEFT
  JOIN B
    ON B.B_ID = A.B_ID
  LEFT
  JOIN C
    ON C.C_ID = B.B_ID
  LEFT
  JOIN D
    ON D.D_ID = B.B_ID
 ORDER
    BY A.A_ID

如果您需要對NULL值進行不同的處理,或者為了處理可能的重復ID值,可以調整查詢。 (示例查詢假定x_ID列的唯一值。)

鑒於已定義的表,我建議以下查詢:

SELECT A.ID, C.C_NAME
FROM @A A INNER JOIN @C C ON A.B_ID=C.C_ID
UNION
SELECT A.ID, D.D_NAME
FROM @A A INNER JOIN @D D ON A.B_ID=D.D_ID

如果您認為可能存在重復的值並且您需要它們,請使用UNION ALL而不是UNION

暫無
暫無

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

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