SQL-запрос для объединения четырех таблиц - PullRequest
0 голосов
/ 15 апреля 2019

Я новичок в написании SQL-запросов. Может кто-нибудь помочь мне написать SQL-запрос для следующих условий и объединений?

У меня есть 4 таблицы, скажем, T1, T2, T3 и T4

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. Я хочу получить все столбцы с T1, когда a4 == "xx"

  2. Если T1.a1 == T2.a1 и T1.a2 == "x", тогда я хочу, чтобы b2 был включен в окончательный результат как новый столбец .

  3. Если T3.c1 == T4.c1 и T4.d2 == "y", то взять значение из d3, которое необходимо присоединить к шагу 4

  4. Если T1.a1 == T3.a1 и T1.a2 == "z", то значение из d3 (шаг 3) должно быть включено в новый столбец окончательного результата

Я пытаюсь решить, как показано ниже, но я не знаю, как добавить значение d3 с шага 3 к 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)

Пожалуйста, помогите мне исправить мой запрос. Ценю вашу помощь.

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Если вы хотите получить нет результатов, если ваши условия не выполнены, этот запрос даст вам нужные результаты.Он использует выражение 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

Демонстрация на dbfiddle

0 голосов
/ 15 апреля 2019

Вы можете написать это как:

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;

Предполагается, что не более одной строки соответствует каждой из двух возможностей.

Если это так, я считаю, что логика здесь лучше отражает ваше намерение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...