Поиск отсутствующего параметра

#sql-server-2012

#sql-server-2012

Вопрос:

В моей базе данных есть две таблицы. Таблица A — это таблица информационных данных, а таблица B — таблица настроек. Как мне найти, что в таблице A отсутствует один из параметров в таблице B.

Например

 Table A
username       setting
Mark           1
Mark           2
Martin         2
Jane           1

Table B
Possible_Setting
1             
2             
3

Result Table
username      missing_setting
Mark          3
Martin        1
Martin        3
Jane          2
Jane          3
  

Спасибо за помощь!

Комментарии:

1. Смотрите это отличное объяснение соединений — 4-й пример

Ответ №1:

Это может быть неэффективно, если размеры таблицы значительны из-за перекрестного соединения, но это единственный ответ, который я смог придумать.

     SELECT a.username, b.Possible_Setting AS missing_setting 
FROM 
    (SELECT DISTINCT username FROM TableA a) a 
    CROSS JOIN TableB b 
WHERE 
    NOT EXISTS (
        SELECT * 
        FROM TableA real_a 
        WHERE   real_a.username = a.username 
            AND real_a.setting = b.Possible_Setting)
ORDER BY 1, 2
  

Установочный код:

 CREATE TABLE TableA (username varchar(20), setting tinyint)
CREATE TABLE TableB (Possible_Setting tinyint PRIMARY KEY)

INSERT TableA VALUES 
('Mark',          1),
('Mark',          2),
('Martin',        2),
('Jane',           1)

INSERT TableB VALUES 
(1),
(2),
(3)