Получить совпадающие значения из нескольких таблиц в SQL - PullRequest
1 голос
/ 23 мая 2019

У меня 6 таблиц с идентификаторами клиентов.Можно ли в одном запросе получить идентификаторы клиентов, совпадающие во всех таблицах?В моем примере клиенты идентифицируют результаты как 8 и 9 (необходимо учитывать, что на практике любая из таблиц может иметь значения или нет)

Большое спасибо С уважением

DECLARE @TCustomerAge  TABLE(
CustomerID  INT not null ); 


DECLARE @TCustomerLocalization  TABLE(
CustomerID  INT not null ); 


DECLARE @TCustomerGroup  TABLE(
CustomerID  INT not null ); 


DECLARE @TCustomerStore  TABLE(
CustomerID  INT not null ); 


DECLARE @TCustomerSales  TABLE(
CustomerID  INT not null ); 


DECLARE @TCustomerPayment  TABLE(
CustomerID  INT not null ); 


--@TCustomerAge empty
insert into @TCustomerLocalization values (8), (9), (11)
insert into @TCustomerGroup values (8), (9), (10), (11)
insert into @TCustomerStore values (8), (9), (11)
--@@TCustomerSales empty
insert into @TCustomerPayment values (2), (3), (5), (8), (9), (10)

-- Result -> 8, 9

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Для обработки пустых таблиц, возможно, лучше использовать union:

with t as (
      select id, '@TCustomerAge' as tablename from @TCustomerAge 
      union  -- uses union to remove duplicates within tables
      select id, '@TCustomerLocalization' from @TCustomerLocalization
      union
      . . .
     )
select t.id
from t cross join
     (select count(distinct tablename) as n from t) n
group by t.id, n.n
having count(*) = n.n;

Пустые таблицы не представлены в t, поэтому count(distinct) учитывает только имеющиеся таблицы.

0 голосов
/ 23 мая 2019
;with CteAllIDs as (
    SELECT CustomerID FROM @TCustomerAge UNION
    SELECT CustomerID FROM @TCustomerLocalization UNION
    SELECT CustomerID FROM @TCustomerGroup UNION
    SELECT CustomerID FROM @TCustomerStore UNION
    SELECT CustomerID FROM @TCustomerSales UNION
    SELECT CustomerID FROM @TCustomerPayment
)
SELECT CteAllIDs.CustomerID
FROM CteAllIDs
WHERE (EXISTS (SELECT * FROM @TCustomerAge WHERE CustomerID = CteAllIDs.CustomerID) 
    OR NOT EXISTS (SELECT * FROM @TCustomerAge))
AND (EXISTS (SELECT * FROM @TCustomerLocalization WHERE CustomerID = CteAllIDs.CustomerID) 
    OR NOT EXISTS (SELECT * FROM @TCustomerLocalization))
AND (EXISTS (SELECT * FROM @TCustomerGroup WHERE CustomerID = CteAllIDs.CustomerID) 
    OR NOT EXISTS (SELECT * FROM @TCustomerGroup))
AND (EXISTS (SELECT * FROM @TCustomerStore WHERE CustomerID = CteAllIDs.CustomerID) 
    OR NOT EXISTS (SELECT * FROM @TCustomerStore))
AND (EXISTS (SELECT * FROM @TCustomerSales WHERE CustomerID = CteAllIDs.CustomerID) 
    OR NOT EXISTS (SELECT * FROM @TCustomerSales))
AND (EXISTS (SELECT * FROM @TCustomerPayment WHERE CustomerID = CteAllIDs.CustomerID) 
    OR NOT EXISTS (SELECT * FROM @TCustomerPayment))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...