Как выполнить SQL JOIN для одной и той же таблицы дважды - PullRequest
0 голосов
/ 01 мая 2019

Я новичок в группе, и я впервые задаю вопрос.

У меня есть таблица tbl1, содержащая 3 столбца (идентификатор, тип, приоритет). Данные выглядят так:

id | type | priority
---+------+---------
1  |   1  |  1
2  |   2  |  1
3  |   1  |  2

У меня есть таблица tbl2, которая содержит все мои ссылки. Данные выглядят так:

id  | type1 | type2 | type3 | string
----+-------+-------+-------+---------
12  |   9   |   1   |    1  | single
12  |  10   |   1   |    2  | single
12  |   9   |   2   |    1  | carton
13  |   9   |   1   |    1  | low
13  |   9   |   2   |    1  | high
13  |   4   |   1   |    1  | low
14  |   9   |   1   |    1  | red
14  |   2   |   1   |    1  | red
14  |   9   |   2   |    1  | yellow

Я хочу присоединиться к tbl2 на tbl1.type = tbl2.type2, где id=12, type1=9 и type3=1.

Я также хочу присоединиться к tbl2 на tbl1.priority = tbl2.type2, где id=13, type1=9 и type3=1.

Моя итоговая таблица должна выглядеть следующим образом:

id | type   | priority
---+--------+---------
1  | single | low
2  | carton | low
3  | single | high

Имеет ли это какой-то смысл? По сути, есть одна справочная таблица, но ее необходимо объединять снова и снова для различных столбцов таблицы 1. Я не знаю, нужно ли это объединять, левое соединение, внутреннее левое соединение.

Ответы [ 4 ]

1 голос
/ 01 мая 2019

Вы можете просто присоединиться к вашему столу дважды:

SELECT 
   tbl1.id, tbl2_t.string, tbl2_p.string
FROM tbl1
LEFT JOIN tbl2 AS tbl2_t ON tbl1.type = tbl2_t.type2 AND 
                               tbl2_t.id=12 AND tbl2_t.type1=9 AND tbl2_t.type3=1
LEFT JOIN tbl2 AS tbl2_p ON tbl1.priority = tbl2_p.type2 AND 
                               tbl2_p.id=13 AND tbl2_p.type1=9 AND tbl2_p.type3=1
0 голосов
/ 01 мая 2019

Вы можете использовать предложение "или" в соединении между двумя таблицами, чтобы оно соединялось как при tbl1.type tlb2.type2, так и при tbl1.priority = tbl2.type2 ... например:

select tbl1.Id, tbl2.string 
from tbl1 inner join tbl2on (tbl1 .type  =tbl2.type1) or (tbl1 .priority = tbl2.type2)
where type1 = 9 and type3 = 1
0 голосов
/ 01 мая 2019

Вы можете использовать разные псевдонимы таблицы

select a.id,  b.string, c.string 
from tbl1 a 
inner  join tbl2 b on a.type = b.type2 
    and b.id =12 
      and b.type1=9 
        and b.type3.=1
inner join tbl2 c on a.type = c.type2 
    and c.id =13 
      and c.type1=9 
        and c.type3.=1
0 голосов
/ 01 мая 2019

Просто создайте вложенное объединение, используя следующий шаблон: (замените текст между <> именами таблиц / столбцов)

SELECT * FROM (

SELECT * FROM <dbo.myTable1> a
LEFT JOIN
        (SELECT * FROM <dbo.myTable2>) b ON a.<type> = b.<type2> WHERE b.<id>=12 AND b.<type1>=9 AND b.<type3>=1

) c  
  LEFT JOIN 
         (SELECT * FROM <dbo.myTable2>) d ON c.<priority> = d.<type2> WHERE c.<id>=13 AND c.<type1>=9 AND c.<type3>=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...