【问题标题】:SQL query for joining four tables连接四张表的SQL查询
【发布时间】:2019-04-14 22:40:27
【问题描述】:

我是编写 SQL 查询的新手,谁能帮我编写以下条件和连接的 SQL 查询?

我有 4 张桌子,比如说 T1T2T3T4

T1 have columns a1(PK), a2, a3, a4

T2 have columns b1(PK), a1(FK), b2

T3 have columns c1(PK), a1(FK)

T4 have columns d1(PK), c1(FK), d2, d3

条件:

  1. a4 == "xx" 时,我想拥有来自T1 的所有列

  2. 如果T1.a1 == T2.a1T1.a2 == "x",那么我希望b2 作为新列 包含在最终结果中。

  3. 如果T3.c1 == T4.c1T4.d2 == "y",则从d3中取值,需要加入step4

  4. 如果T1.a1 == T3.a1T1.a2 == "z",则来自d3(步骤3)的值应包含在最终结果的新列

我正在尝试如下解决,但我不知道如何在最终结果中将第 3 步中的值 d3 添加到 b2

select T1.a1,T1.a2,T1.a3,T1.a4,T2.b2 from
T1
left join T2 on T1.a1 == T2.a1 AND T1.a2 == "x"
left join ( 
    select T3.a1,T4.d3 from T3,T4
    where T3.c1 == T4.c1 AND T4.d2 == "y") 
) joined on joined.a1 == T1.a1 and T1.a2 == "z"
where a4 == "xx";

样本数据

T1 table :

a1 |  a2 | a3 | a4 |
1  |  x  | cat| xx |
2  |  aa | hat| la |
3  |  z  | mat| xx |

T2 table : 

b1  |  b2  | a1 | 
11  |  984 | 1  | 
22  |  234 | 2  | 

T3 table : 

c1   |  a1 | 
111  |  3  | 
222  |  7  | 

T4 table : 

d1    |  d2  | d3  | c1  |
1111  |  y   | 100 | 111 |
2222  |  yy  | 200 | 333 |


Expected Result : 

a1  |  a2  | a3   | a4 | new column
1   |  x   | cat  | xx | 984 (from T2.b2)
3   |  z   | mat  | xx | 100 (from T4.d3)

请帮助我更正我的查询。感谢您的帮助。

【问题讨论】:

  • 显示样本数据和样本结果会有所帮助。
  • “最终结果中包含在 b2 列(步骤 2)中”是什么意思?
  • @danblack 感谢您的回复。我已经用示例数据和预期的最终结果更新了我的问题
  • @Nick 感谢您的回复。我已经更新了我的问题。我希望在最终结果中包含来自 b2 和 d3 的数据的新列。
  • 如果T1.a2 不等于xz,你想在新列中显示什么?或者你不想要任何结果?当T1.a2 = 'z'T4.d2 != 'y' 时呢?

标签: mysql sql database join


【解决方案1】:

假设您在不满足条件时想要 no 结果,则此查询将为您提供所需的结果。它使用CASE 表达式为new column 选择正确的值,使用a2 的值来决定是使用b2 还是d3 作为该值。 WHERE 子句将不符合条件的行排除在外。

SELECT T1.*, 
       CASE WHEN T1.a2 = 'x' THEN T2.b2
            WHEN T1.a2 = 'z' THEN T4.d3
       END AS `new column`
FROM T1
LEFT JOIN T2 ON T2.a1 = T1.a1
LEFT JOIN T3 ON T3.a1 = T1.a1
LEFT JOIN T4 ON T4.c1 = T3.c1
WHERE a4 = 'xx' AND (a2 = 'x' OR a2 = 'z' AND d2 = 'y')
ORDER BY a1

输出:

a1  a2  a3  a4  new column
1   x   cat xx  984
3   z   mat xx  100

Demo on dbfiddle

【讨论】:

    【解决方案2】:

    你可以这样写:

    SELECT T1.*,
           (CASE WHEN T1.a2 = 'x'
                 THEN (SELECT T2.b2
                       FROM T2
                       WHERE T2.a1 = T1.a1
                      )
                 ELSE (SELECT T4.d3
                       FROM T3 JOIN
                            T4
                            ON T4.c1 = T3.c1
                       WHERE T3.a1 = T1.a1 AND T4.d2 = 'y'
                      )
            END) as new_column
    FROM T1
    WHERE T1.a4 = 'xx' AND T1.a2 IN ('x', 'z')
    ORDER BY T1.a1;
    

    这假设两种可能性中的每一种最多匹配一行。

    如果是这样,我发现这里的逻辑更能抓住你的意图。

    【讨论】:

    • 非常感谢您的询问
    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多