SQL: проверьте, существует ли несколько записей в нескольких таблицах - PullRequest
0 голосов
/ 01 ноября 2019

В моей базе данных есть таблица с отношением «многие ко многим» к нескольким другим таблицам. Я хотел бы знать, для нескольких записей одновременно, существует ли элемент в каждой из других таблиц. Вот простой пример диаграммы:

--------------- 
| base_table  |
---------------
| key | name  |
---------------
| 1   | item1 |
| 2   | item2 |
| 3   | item3 |
| 4   | item4 |
---------------

-------------------------------
| table_2                     |
-------------------------------
| key | base_key  | other_key |
-------------------------------
| 1   | 1         | 1         |
| 2   | 1         | 2         |
| 3   | 1         | 3         |
| 4   | 2         | 1         |
| 5   | 2         | 4         |
| 6   | 4         | 4         |
-------------------------------

-------------------------------
| table_3                     |
-------------------------------
| key | base_key  | other_key |
-------------------------------
| 1   | 2         | 1         |
| 2   | 3         | 2         |
-------------------------------

И затем я ищу вывод, подобный этому:

-----------------------------------
| name  | in_table_2 | in_table_3 |
-----------------------------------
| item1 | true       | false      |
| item2 | true       | true       |
| item3 | false      | true       |
| item4 | true       | false      |
-----------------------------------

Я использую MS SQL Server.

Ответы [ 2 ]

3 голосов
/ 01 ноября 2019

Вы можете использовать union all и агрегацию, чтобы узнать, какие ключи и в каких таблицах:

select base_key, max(in_2) as in_2, max(in_3) as in_3
from ((select distinct base_key, 1 as in_2, 0 as in_3
       from table2
      ) union all
      (select distinct base_key, 0 as in_2, 1 as in_3
       from table3
      )
     ) t
group by base_key;

Возвращает «1», если ключ находится в таблице, и «0», если это не так. SQL Server не имеет логических типов, и для этой цели кажется глупым создавать строку.

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

2 голосов
/ 01 ноября 2019

Хотя мне понравился пост @ GordonLindoff, я подумал, что следующее сработало бы так же хорошо:

SELECT DISTINCT
       b.Name,
       in_table_2 = CASE WHEN c.Base_key IS NULL THEN 0 ELSE 1 END,
       in_table_3 = CASE WHEN d.Base_key IS NULL THEN 0 ELSE 1 END
FROM Base_Table b
    LEFT JOIN Table_2 c
        ON b.key = c.Base_Key
    LEFT JOIN Table_3 d
        ON b.key = d.Base_Key;

Я также повторил бы его комментарий о 1 и 0 в SQL. Если вам действительно, действительно нужно «True» или «False» на вашем дисплее, сделайте это на внешнем интерфейсе или измените 0 и 1 в операторах case на False и True, соответственно.

У кого-нибудь есть какие-либо возражения по этому поводу?

Я сделал с SQLFiddle, перечисленным здесь. http://sqlfiddle.com/#!18/d6547/28

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