2014-02-19 13 views
0

Вот мои таблицы:Сортировка данных из одной таблицы на основе другой таблицы

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 
) 

SQLFiddle

ответ

2

Я думаю, что вы ищете что-то вроде следующего:

select B.* from tableB B 
left join tableA A 
    on B.id = A.id and B.type = A.type 
where B.isActive = 1 
    and A.id is null 
order by B.id, B.type 

При использовании соединения слева, это означает, что строки в таблице Б, которые не имеют строк для соединения в таблице, будут иметь все столбцы A. * null. Это позволяет вам добавить предложение where, чтобы проверить, где указаны записи tableA, и, следовательно, определить, что содержится в таблицеB, которое является активным, а не в таблице.

+0

Результат, которого мы действительно должны ожидать, - это 103 B от tableA, потому что мы просто хотим для проверки в таблицеA до последнего типа для этого идентификатора. например, для ID 101, последний тип - D, поэтому мы должны проверять активные A, B, C, D в таблицеB для ID 101. Для ID 102 B является последним типом, поэтому в таблице B мы проверяем только A nd B для 102 и хотите попасть в набор результатов, если в таблице А отсутствуют активные строки в таблице. –

+0

Я не совсем уверен, что вы имеете в виду здесь. Запрос вернет значения, которые не находятся в таблице A, но активны в TableB. –

Смежные вопросы