2015-05-14 2 views
1

Набор данных 1:Смотрите, если несколько записей существуют в другой таблице

Cust_Ref | ACC1 | ACC2 | ACC3 
------------+-----------+-----------+--------- 
1000001  | ALPHA | BRAVO | CHARLIE 
1000002  | ALPHA | BRAVO | CHARLIE 
1000003  | ALPHA | BRAVO | CHARLIE 
1000004  | DELTA | ECHO | 
1000005  | DELTA | ECHO | 
1000006  | FOXTROT | 
1000007  | FOXTROT | 

данных 2:

Cust_Ref | ACC 
------------+-------- 
1000001  | ALPHA 
1000001  | BRAVO 
1000001  | DELTA 
1000004  | DELTA 
1000004  | ECHO 
1000006  | FOXTROT 

Набор данных 1 показывает ссылки клиентов и счетов они должны иметь. Так, например, 1000001 должны иметь учетные записи - ALPHA, BRAVO, CHARLIE. Клиент 1000002 имеет DELTA и ECHO и т. Д.

Набор данных 2 показывает, какие учетные записи фактически связаны с ссылкой на клиента.

Есть ли там, где я могу вернуть экземпляры отсутствующих учетных записей с помощью T-SQL?

Пример: В наборе данных, который я предоставил клиенту, 1000001 должен иметь ALPHA, BRAVO, CHARLIE, но Data Set 2 показывает, что у клиента нет CHARLIE.

ответ

3

Учитывая этот DDL и образец данных:

DECLARE @Table1 TABLE (
    Cust_Ref VARCHAR(10) PRIMARY KEY, 
    ACC1 VARCHAR(10) NULL, 
    ACC2 VARCHAR(10) NULL, 
    ACC3 VARCHAR(10) NULL 
) 

INSERT INTO @Table1 VALUES 
('1000001','ALPHA','BRAVO','CHARLIE'), 
('1000002','ALPHA','BRAVO','CHARLIE'), 
('1000003','ALPHA','BRAVO','CHARLIE'), 
('1000004','DELTA','ECHO',NULL), 
('1000005','DELTA','ECHO',NULL), 
('1000006','FOXTROT','FOXTROT',NULL), 
('1000007','FOXTROT','FOXTROT',NULL) 

DECLARE @Table2 TABLE (
    Cust_Ref VARCHAR(10) NOT NULL, 
    ACC VARCHAR(10) NOT NULL 
) 

INSERT INTO @Table2 VALUES 
('1000001','ALPHA'), 
('1000001','BRAVO'), 
('1000001','DELTA'), 
('1000004','DELTA'), 
('1000004','ECHO'), 
('1000006','FOXTROT') 

Вы можете использовать UNPIVOT и за исключением случаев, таким образом:

SELECT Cust_Ref, ACC 
FROM @Table1 UNPIVOT (ACC FOR COL IN (ACC1, ACC2, ACC3)) U 
EXCEPT 
SELECT Cust_Ref, ACC 
FROM @Table2 
1
(Select cust_ref, acc1 account 
from dataSet1 
union 
Select cust_ref, acc2 account 
from dataSet1 
union 
Select cust_ref, acc3 account 
from dataSet1)z 
Where Not exists (Select * from dataSet2 
        where cust_ref = z.CustRef 
         and acc = z.account) 
0
WITH DataSet1 AS (-- Define DataSet1 
    SELECT * 
    FROM (VALUES 
     (1000001, 'ALPHA', 'BRAVO', 'CHARLIE') 
     , (1000002, 'ALPHA', 'BRAVO', 'CHARLIE') 
     , (1000003, 'ALPHA', 'BRAVO', 'CHARLIE') 
     , (1000004, 'DELTA', 'ECHO', NULL) 
     , (1000005, 'DELTA', 'ECHO', NULL) 
     , (1000006, 'FOXTROT', NULL, NULL) 
     , (1000007, 'FOXTROT', NULL, NULL) 
    ) A (Cust_Ref, ACC1, ACC2, ACC3) 
), DataSet2 AS (-- Define DataSet2 
    SELECT * 
    FROM (VALUES 
     (1000001, 'ALPHA') 
     , (1000001, 'BRAVO') 
     , (1000004, 'DELTA') 
     , (1000004, 'ECHO') 
     , (1000006, 'FOXTROT') 
    ) A (Cust_Ref, ACC) 
) 
SELECT A.Cust_Ref 
    , B.ACC 
FROM DataSet1 A 
CROSS APPLY(VALUES -- Pivot ACC1, ACC2, and ACC3 into ACC 
    (A.ACC1) 
    , (A.ACC2) 
    , (A.ACC3) 
) B (ACC) 
WHERE B.ACC IS NOT NULL -- Remove NULL ACCs 
    AND NOT EXISTS (-- Remove ACCs that exist in DataSet2 
    SELECT 1 
    FROM DataSet2 
    WHERE A.Cust_Ref = Cust_Ref 
     AND B.ACC = ACC 
); 
Смежные вопросы