вернуть true, если все записи первой таблицы существуют во второй таблице - PullRequest
3 голосов
/ 16 марта 2012

У меня есть две таблицы:

declare @t1 table (id int)
declare @t2 table (id int)


insert into @t1
select 1 union select 3 union select 7

insert into @t2
select 1 union select 3 union select 7 union select 9 union select 4

select count(*) from @t1 t inner join @t2 t1 on t.id = t1.id

Я получаю результат для вышеуказанного запроса как 3. Мне нужно true или false, если все записи в t1 существуют в t2.

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

Ответы [ 5 ]

2 голосов
/ 16 марта 2012
SELECT CASE 
         WHEN EXISTS (SELECT id 
                      FROM   @t1 
                      EXCEPT 
                      SELECT id 
                      FROM   @t2) THEN 0 
         ELSE 1 
       END 
1 голос
/ 16 марта 2012

Сравнение количества совпадающих строк с общим числом строк в @t1 может быть более эффективным.Иногда вам просто нужно попробовать несколько методов и посмотреть на планы запросов, чтобы увидеть, какой из них лучше всего работает в вашей ситуации.Вам понадобятся несколько тестовых таблиц с таким же количеством данных и правильными индексами и тому подобное.

declare @t1 table (id int) 
declare @t2 table (id int) 

insert into @t1 
select 1 union select 3 union select 7

insert into @t2 
select 1 union select 3 union select 7 union select 9 union select 4 

select case 
  when (select count(*) from @t1 t join @t2 t1 on t.id = t1.id) = 
       (select count(*) from @t1) then 1 else 0
  end as rows_match
1 голос
/ 16 марта 2012
SELECT (CASE WHEN 
              (SELECT COUNT(*) from t1 where 
                  not id IN (select id from t2)) = 0 THEN 
                  convert(bit, 1) 
             ELSE convert(bit, 0) END) 
1 голос
/ 16 марта 2012

Использование exists (возможно, это будет более эффективно):

select
    case
        when not exists (select 1
            from @t1 t1
            where not exists(select 1 from @t2 t2 where t2.id = t1.id))
            then cast(1 as bit)
        else cast(0 as bit)
    end
1 голос
/ 16 марта 2012
declare @t1 table (id int)
declare @t2 table (id int)

insert into @t1
select 1 union select 3 union select 7

insert into @t2
select 1 union select 3 union select 7 union select 9 union select 4

if exists(
   select id from @t2
   except
   select id from @t1
)    print 'false'
else print 'all the records in t1 exists in t2'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...