รวม 2 ตารางเพื่อดึงค่าทั้งหมดจากแต่ละตาราง

ฉันมี 2 ตารางที่ฉันต้องการเข้าร่วมด้วยวิธีเฉพาะเพื่อดึงข้อมูลทั้งหมดในแต่ละตาราง แม้ว่าฟิลด์ที่รวมบางฟิลด์อาจไม่มีอยู่ในแต่ละฟิลด์ เหมือนกับการรวมภายนอกแบบเต็ม

ตาราง ก

+--------+-------+------+-------+
| Group  | Name  | Year | Value |
+--------+-------+------+-------+
|      1 | Joe   | 2018 |    23 |
|      1 | Joe   | 2019 |    56 |
|      2 | Fred  | 2019 |    89 |
|      2 | Fred  | 2020 |    45 |
+--------+-------+------+-------+

ตาราง ข

+-------+------+------+-------+----------+
| Group | Name | Year | Scope |  Status  |
+-------+------+------+-------+----------+
|     1 | Joe  | 2019 |    78 | Approved |
|     2 | Fred | 2018 |    12 | Approved |
|     2 | Fred | 2020 |   987 | Started  |
|     2 | Fred | 2021 |   321 | Sent     |
+-------+------+------+-------+----------+

ฉันต้องการเข้าร่วมใน A.Group = B.Group และ A.Year = B.Year แต่เมื่อปีอยู่ในรายการหนึ่งและไม่ใช่อีกรายการหนึ่ง ก็จะแสดงค่าว่างในอีกด้านหนึ่ง ดังนั้นจะมีแถวสำหรับทุกชื่อทุกปีและค่าที่สอดคล้องกันหรือ 0/null ขึ้นอยู่กับว่ามีอะไรบ้าง ดังนั้นผลลัพธ์ของตัวอย่างนี้ควรมีลักษณะดังนี้:

ตาราง A และ B

+---------+--------+--------+---------+---------+--------+--------+---------+----------+
| A.Group | A.Name | A.Year | A.Value | B.Group | B.Name | B.Year | B.Scope | B.Status |
+---------+--------+--------+---------+---------+--------+--------+---------+----------+
|       1 | Joe    |   2018 |      23 |       1 | Joe    |   2018 |       0 | <null>   |
|       1 | Joe    |   2019 |      56 |       1 | Joe    |   2019 |      78 | Approved |
|       1 | Joe    |   2020 |       0 |       1 | Joe    |   2020 |       0 | <null>   |
|       1 | Joe    |   2021 |       0 |       1 | Joe    |   2021 |       0 | <null>   |
|       2 | Fred   |   2018 |       0 |       2 | Fred   |   2018 |      12 | Approved |
|       2 | Fred   |   2019 |      89 |       2 | Fred   |   2019 |       0 | <null>   |
|       2 | Fred   |   2020 |      45 |       2 | Fred   |   2020 |     987 | Started  |
|       2 | Fred   |   2021 |       0 |       2 | Fred   |   2021 |     321 | Sent     |
+---------+--------+--------+---------+---------+--------+--------+---------+----------+

person David_S53    schedule 15.01.2020    source แหล่งที่มา
comment
ตัวอย่างที่ทำซ้ำได้น้อยที่สุด โปรด (รวม DBMS ด้วย) ทำอะไรได้บ้าง? คุณรู้หรือไม่ว่าการรวมภายนอกคืออะไร? ดูวิธีถาม ศูนย์ช่วยเหลืออื่นๆ ลิงก์ & ข้อความวางเมาส์เหนือลูกศรลงคะแนน คำอธิบายสิ่งที่คุณต้องการไม่ชัดเจน มันไม่มีประโยชน์ที่จะบอกว่าคุณต้องการบางอย่างเช่นการเข้าร่วม คุณไม่สามารถคาดหวังได้ว่าจะสามารถเขียนโค้ดโซลูชันได้ หากคุณไม่สามารถระบุอย่างชัดเจนว่าเงื่อนไขสำหรับแถวของค่าที่จะอยู่ในผลลัพธ์คืออะไร   -  person philipxy    schedule 15.01.2020


คำตอบ (2)


หากฐานข้อมูลของคุณรองรับ CTE คุณสามารถใช้ CTE ได้ กรณีอื่นที่คุณสามารถใช้ SUB QUERY เพื่อแทนที่ CTE ได้โดยรับความช่วยเหลือจากตรรกะด้านล่างเพื่อให้ได้ผลลัพธ์ที่ต้องการ

สาธิตที่นี่

WITH CTE_Group([Group],Name)
AS
(
    SELECT DISTINCT [Group],Name FROM tab_A
    UNION 
    SELECT DISTINCT [Group],Name FROM tab_B
),
CTE_Year(Year)
AS
(
    SELECT DISTINCT Year FROM tab_A
    UNION 
    SELECT DISTINCT Year FROM tab_B
)
SELECT A.[Group],A.Name,B.Year,ISNULL(C.Value,0) Value,
A.[Group],A.Name,B.Year,ISNULL(D.Scope,0) Scope,D.Status
FROM CTE_Group A
CROSS APPLY CTE_Year B
LEFT JOIN Tab_A C ON A.[Group] = C.[Group] AND B.Year = C.Year
LEFT JOIN Tab_B D ON A.[Group] = D.[Group] AND B.Year = D.Year
ORDER BY 1,3

เอาท์พุท-

Group   Name    Year    Value   Group   Name    Year    Scope   Status
1       Joe     2018    23      1       Joe     2018    0   
1       Joe     2019    56      1       Joe     2019    78      Approved
1       Joe     2020    0       1       Joe     2020    0   
1       Joe     2021    0       1       Joe     2021    0   
2       Fred    2018    0       2       Fred    2018    12      Approved
2       Fred    2019    89      2       Fred    2019    0   
2       Fred    2020    45      2       Fred    2020    987     Started
2       Fred    2021    0       2       Fred    2021    321     Sent
person mkRabbani    schedule 15.01.2020
comment
เยี่ยมมาก นั่นแหละ สามารถเห็นได้ว่ายังรองรับกรณีที่ Name อาจไม่มีปีในตารางใดตารางหนึ่ง และจะยังคงแสดงรายการแถวสำหรับชื่อเหล่านั้นโดยไม่คำนึงถึง 0/null และยังเลือกปีเพิ่มเติมใด ๆ ที่เพิ่มเข้ามาเพื่อทำเช่นเดียวกัน ขอบคุณสำหรับความช่วยเหลือของคุณ! - person David_S53; 15.01.2020
comment
ยินดีต้อนรับคุณ @David_S53 เป็นอย่างยิ่ง ดีใจที่ได้ยินว่ามันช่วยได้ :) โปรดอย่าลืมโหวตด้วยเช่นกัน ;) - person mkRabbani; 15.01.2020

ถ้าฉันเข้าใจถูกต้องเดวิด นี่ควรเป็นสิ่งที่คุณต้องการ แจ้งให้เราทราบ

Select
A.Group, A.Name, A.Year, coalesce(A.Value,0) as A.Value, B.Group, B.Name, B.Year, B.Scope, B.Status
From TableA A cross join TableB B on A.Group = B.Group and A.Year = B.Year
person zip    schedule 15.01.2020