#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)