Вот мои таблицы:Сортировка данных из одной таблицы на основе другой таблицы
create table tableA (id int, type varchar(5))
insert into tableA (ID,TYPE)
values
(101,'A'),
(101,'C'),
(101,'D'),
(102,'A'),
(102,'B'),
(103,'A'),
(103,'C')
create table tableB (id int, type varchar(5), isActive bit)
insert into tableB (id, type, isActive)
Values
(101,'A',1),
(101,'B',0),
(101,'C',0),
(101,'D',1),
(102,'A',1),
(102,'B',0),
(102,'C',1),
(102,'D',1),
(103,'A',1),
(103,'B',1),
(103,'C',1),
(103,'D',1)
Теперь я хочу сделать две вещи здесь: 1) Найти строки, которые присутствуют в tableA
но isActive = 0
в tableB
. (Сделано)
select A.* from tableA A
join tableB B
on A.id = B.id and A.type = B.type
where B.isactive = 0
2) Найти строки, которые отсутствуют в tableA
но isActive = 1
в tableB
. Например, ID 103, тип B активен в tableB
, но отсутствует в таблице A. Меня не интересует существование типа D в tableA
, потому что я проверяю только последнюю запись в tableA
, которая является C. Кроме того, ABCD для всех идентификаторов, они могут быть активными или неактивными.
Благодарим за помощь!
Мои усилия: (не работает)
select A.* from tableA A
where exists (
select B.* from tableA A
join tableB B
on a.id = b.id
where b.isActive = 1
order by b.id,b.type
)
Результат, которого мы действительно должны ожидать, - это 103 B от tableA, потому что мы просто хотим для проверки в таблицеA до последнего типа для этого идентификатора. например, для ID 101, последний тип - D, поэтому мы должны проверять активные A, B, C, D в таблицеB для ID 101. Для ID 102 B является последним типом, поэтому в таблице B мы проверяем только A nd B для 102 и хотите попасть в набор результатов, если в таблице А отсутствуют активные строки в таблице. –
Я не совсем уверен, что вы имеете в виду здесь. Запрос вернет значения, которые не находятся в таблице A, но активны в TableB. –