SQL Server 2012 Как определить, находятся ли все значения в таблице A в таблице B - PullRequest
3 голосов
/ 19 июня 2019

У меня есть две таблицы (A & B), которые имеют общее значение (цвет), обе таблицы могут иметь любое количество строк.Я пытаюсь найти способ определить, существуют ли все отдельные «Цвета» в таблице A в таблице B:

Я попытался использовать EXCEPT, что почти работает, к сожалению, он возвращает false, когда в таблице B больше цветовчем таблица A, которая не имеет значения, все, что меня волнует, это если каждый отдельный цвет из таблицы A находится в таблице B. Я возился с EXISTS и IN, но не вижу, чтобы получить правильные результаты

declare @TableA table (Color varchar(10))
declare @TableB table (Color varchar(10))

insert into @TableA(Color) values ('red')
insert into @TableA(Color) values ('blue')
insert into @TableA(Color) values ('green')
--insert into @TableA(Color) values ('orange')


insert into @TableB(Color) values ('red')
insert into @TableB(Color) values ('blue')
insert into @TableB(Color) values ('green')
insert into @TableB(Color) values ('yellow')
insert into @TableB(Color) values ('purple')

IF NOT EXISTS (
    SELECT Color FROM @TableA
    EXCEPT
    SELECT Color FROM @TableB
)
SELECT 'true'
ELSE SELECT 'false'

Я бы хотел, чтобы вышеприведенный код вывел 'true'.

IF table A Colors > table B Colors THEN false
IF table A Colors <= table B Colors THEN true.

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Есть много способов сделать это.Вы можете использовать левое соединение для этого довольно легко.

if exists
(
    SELECT a.Color 
    FROM @TableA a
    left join @TableB b on b.Color = a.Color
    where b.Color is null
) 
    select 'Some Colors in A are not in B'
else
    select 'ALL Colors in A exist in B'
0 голосов
/ 19 июня 2019

Другим способом может быть сравнение количества отдельных элементов в TableA с количеством отдельных элементов в INNER JOIN между TableA и TableB

Это далеко не оптимизированныйрешение, но оно работает.

SELECT
CASE WHEN (SELECT COUNT(*)
    FROM
    (
        SELECT a.Color
        FROM @TableA a
        INNER JOIN @TableB b
        ON a.Color = b.Color
        GROUP BY a.Color
    ) T1) = (SELECT COUNT(*)
    FROM
    (
        SELECT a.Color
        FROM @TableA a
        GROUP BY a.Color
    ) T2)
    THEN 'true'
    ELSE 'false'
END
0 голосов
/ 19 июня 2019

Вы также можете просто использовать существующий запрос и добавить DISTINCT:

IF NOT EXISTS (
    SELECT DISTINCT Color FROM @TableA
    EXCEPT
    SELECT DISTINCT Color FROM @TableB
)
SELECT 'true'
ELSE SELECT 'false'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...