поиск несопоставимых данных из двух таблиц - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь написать запрос, чтобы найти записи, у которых нет соответствующей записи в другой таблице.

Например, у меня есть две таблицы, структура которых выглядит примерно так:

Table1

Address ID | Address Type
AD7233654242 | Condo
AD7233654242 | Condo
AD7233654243 | Apartment
AD7233654244 | Condo

Table2

Address ID | Address Type
AD7233654242 | Condo
AD7233654242 | Apartment
AD7233654243 | Apartment
AD7233654244 | Condo

На основании приведенных выше данных вы заметите, что идентификатор адреса AD7233654242 имеет несоответствующий тип адреса. Таблица A показывает квартиру, а таблица B показывает квартиру. Таким образом, в результате запроса я хочу отобразить идентификатор и тип адреса из обеих таблиц.

Любые предложения по запросу, чтобы сделать это?

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Вы можете запрашивать совпадающие и не совпадающие записи, используя тип join. Ниже приведены примеры различных объединений.

declare @tbl1 table(AddressID varchar(20), AddressType varchar(50))
declare @tbl2 table(AddressID varchar(20), AddressType varchar(50))

insert @tbl1(AddressID,AddressType) values
('AD7233654242', 'Condo'),
('AD7233654242', 'Condo'),
('AD7233654243', 'Apartment'),
('AD7233654244', 'Condo'),
('AD7233654245', 'Condo')--my sample

insert @tbl2(AddressID,AddressType) values
('AD7233654242', 'Condo'),
('AD7233654242', 'Apartment'),
('AD7233654243', 'Apartment'),
('AD7233654244', 'Condo')

--records in @tbl1 matching @tbl2
select t1.AddressID addrId_1, t1.AddressType addrType_1, t2.AddressID addrId_2, t2.AddressType addrType_2
from @tbl1 t1 -- 1st or left table
inner join @tbl2 t2 --2nd or right table
on t1.AddressID=t2.AddressID and t1.AddressType=t2.AddressType

--records in @tbl1 not matching @tbl2
select t1.AddressID, t1.AddressType
from @tbl1 t1
left join @tbl2 t2 on t1.AddressID=t2.AddressID and t1.AddressType=t2.AddressType
where t2.AddressID is null

--records in @tbl2 not matching @tbl1
select t2.AddressID, t2.AddressType
from @tbl1 t1
right join @tbl2 t2 on t1.AddressID=t2.AddressID and t1.AddressType=t2.AddressType
where t1.AddressID is null

--all mismatches
select t1.AddressID addrId_1, t1.AddressType addrType_1, t2.AddressID addrId_2, t2.AddressType addrType_2
from @tbl1 t1
full join @tbl2 t2 on t1.AddressID=t2.AddressID and t1.AddressType=t2.AddressType
where t1.AddressID is null or t2.AddressID is null
0 голосов
/ 26 октября 2018

Вы можете попробовать использовать левое соединение и ноль, где условие

SELECT t1.AddressID, t1.AddressType,t2.AddressType
FROM Table1 t1
left JOIN Table2 t2
    ON t1.AddressID = t2.AddressID AND t1.AddressType=t2.AddressType
where t2.AddressID is null
0 голосов
/ 26 октября 2018

Я думаю, это то, что вы спрашиваете ..

SELECT * from table1 T1
where exists (
SELECT * from table2 T2
where T1.AddressID = T2.AddressID
and T1.AddressType<>T1.AddressType)

UNION 

SELECT * from table1 T2
where exists (
SELECT * from table2 T1
where T1.AddressID = T2.AddressID
and T1.AddressType<>T1.AddressType)
0 голосов
/ 26 октября 2018

Здесь должно работать простое объединение:

SELECT
    t1.AddressID,
    t1.AddressType,
    t2.AddressType
FROM Table1 t1
INNER JOIN Table2 t2
    ON t1.AddressID = t2.AddressID AND t1.AddressType <> t2.AddressType;

Это на самом деле вернет две записи для AD7233654242.Если у вас есть определенный ожидаемый результат, мы можем изменить вышеуказанный запрос, используя эту логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...