Я хочу сравнить значение таблицы 1 с таблицей 2, но не только с одним столбцом, но и с несколькими столбцами, а также включить дату.

Таблица 1

----+-----------+
| Id | date      |
| 1  | 4/15/2020 |
| 2  | 4/16/2020 |
| 3  | 4/17/2020 |
| 4  | 4/18/2020 |
| 5  | 4/19/2020 |
| 6  | 4/20/2020 |
| 7  | 4/21/2020 |
| 8  | 4/22/2020 |
| 9  | 4/23/2020 |
| 10 | 4/24/2020 |
| 11 | 4/25/2020 |
| 12 | 4/26/2020 |
| 13 | 4/27/2020 |
| 14 | 4/28/2020 |
| 15 | 4/29/2020 |
| 16 | 4/30/2020 |
| 17 | 5/1/2020  |
| 18 | 5/2/2020  |
| 19 | 5/3/2020  |
| 20 | 5/4/2020  |
+----+-----------+

Таблица 2

+-------+------+-------+--------+------+-------+
| Batch | call | Zone  | Batch2 | call | zone  |
| 1     | A    | South | 100    | B    | North |
| 15    | A    | South | 102    | B    | North |
| 22    | A    | South | 105    | B    | North |
| 30    | A    | South | 605    | B    | North |
| 2     | A    | South | 44     | B    | North |
| 8     | A    | South | 78     | B    | North |
| 75    | A    | South | 1      | B    | North |
| 80    | A    | South | 2      | B    | North |
| 6     | A    | South | 3      | B    | North |
| 4     | A    | South | 78     | B    | North |
| 8     | A    | South | 6      | B    | North |
| 45    | A    | South | 9      | B    | North |
| 60    | A    | South | 78     | B    | North |
| 78    | A    | South | 9      | B    | North |
| 34    | A    | South | 10     | B    | North |
| 80    | A    | South | 11     | B    | North |
| 46    | A    | South | 12     | B    | North |
| 77    | A    | South | 789    | B    | North |
| 95    | A    | South | 456    | B    | North |
| 400   | A    | South | 658    | B    | North |
+-------+------+-------+--------+------+-------+

Результат:

+-------+------+-----------+------+-------+--------+------+-------+------+-------+
| Batch | id   | date      | call | Zone  | Batch2 | id   | date  | call | zone  |
| 1     | 1    | 4/15/2020 | A    | South | 100    | #N/A | #N/A  | B    | North |
| 15    | 15   | 4/29/2020 | A    | South | 102    | #N/A | #N/A  | B    | North |
| 22    | #N/A | #N/A      | A    | South | 105    | #N/A | #N/A  | B    | North |
| 30    | #N/A | #N/A      | A    | South | 605    | #N/A | #N/A  | B    | North |
| 2     | 2    | 4/16/2020 | A    | South | 44     | #N/A | #N/A  | B    | North |
| 8     | 8    | 4/22/2020 | A    | South | 78     | #N/A | #N/A  | B    | North |
| 75    | #N/A | #N/A      | A    | South | 1      | 1    | 43936 | B    | North |
| 80    | #N/A | #N/A      | A    | South | 2      | 2    | 43937 | B    | North |
| 6     | 6    | 4/20/2020 | A    | South | 3      | 3    | 43938 | B    | North |
| 4     | 4    | 4/18/2020 | A    | South | 78     | #N/A | #N/A  | B    | North |
| 8     | 8    | 4/22/2020 | A    | South | 6      | 6    | 43941 | B    | North |
| 45    | #N/A | #N/A      | A    | South | 9      | 9    | 43944 | B    | North |
| 60    | #N/A | #N/A      | A    | South | 78     | #N/A | #N/A  | B    | North |
| 78    | #N/A | #N/A      | A    | South | 9      | 9    | 43944 | B    | North |
| 34    | #N/A | #N/A      | A    | South | 10     | 10   | 43945 | B    | North |
| 80    | #N/A | #N/A      | A    | South | 11     | 11   | 43946 | B    | North |
| 46    | #N/A | #N/A      | A    | South | 12     | 12   | 43947 | B    | North |
| 77    | #N/A | #N/A      | A    | South | 789    | #N/A | #N/A  | B    | North |
| 95    | #N/A | #N/A      | A    | South | 456    | #N/A | #N/A  | B    | North |
| 400   | #N/A | #N/A      | A    | South | 658    | #N/A | #N/A  | B    | North |
+-------+------+-----------+------+-------+--------+------+-------+------+-------+

Запрос:

select batch,
    (case when batch=id then id else null end ) id,
    (case when batch=id then date else null end) date,
    call,
    zone,
    batch2,
    (case when batch2=id then id else null end ) id1,
    (case when batch2=id then date else null end) date1,
    call,
    zone
table1 x
left join table2 y on x.id=y.batch and x.id=y.batch2
0
Steve Richard 16 Апр 2020 в 02:01

1 ответ

Лучший ответ

Ваша проблема в том, что вам нужно дважды JOIN table2 to table1, один раз, чтобы получить дату первого пакета, и один раз, чтобы получить вторую:

select y.batch1,
    (case when y.batch1=x1.id then x1.id else null end ) id1,
    (case when y.batch1=x1.id then x1.date else null end) date1,
    call1,
    zone1,
    y.batch2,
    (case when y.batch2=x2.id then x2.id else null end ) id2,
    (case when y.batch2=x2.id then x2.date else null end) date2,
    call2,
    zone2
from table2 y
left join table1 x1 on x1.id=y.batch1
left join table1 x2 on x2.id=y.batch2

Вывод слишком длинный для вставки сюда, но есть демонстрация на SQLFiddle.

Обратите внимание, что мне пришлось изменить имена некоторых столбцов, поскольку в таблице 2 есть дубликаты.

0
Nick 15 Апр 2020 в 23:36