2016-10-31 4 views
2

Мне нужно найти все строки в таблице SQL, где некоторая комбинация не существует. Например, рассмотрим приведенную ниже таблицу.найти строки, где комбинация не существует SQL

ID Column_1 Column_2 
1. ID1  ABC 
2. ID1  XYZ 
3. ID1  QWE 
4. ID2  XYZ 
5. ID2  QWE 
6. ID3  XYZ 
7. ID3  ABC 
8. ID3  QWE 

В приведенной выше таблице мне нужно вернуть ID2, как нет (ID2, ABC). В настоящее время я делаю WHILE и IF EXISTS для каждого идентификатора в таблице, но есть ли более эффективный способ? Объем здесь большой.

UPDATE: Все приведенные ниже ответы возвращают ожидаемые значения. Имеет ли один метод преимущество перед другими?

+0

Я удалил несовместимые теги базы данных. Добавьте обратно тег для базы данных, которую вы действительно используете. –

+0

mysql или sql-server .. ??? – scaisEdge

+0

sql server. сожалею – Noob

ответ

0

может быть вам нужно не в и подвыбор

select distinct column_1 
from my_table 
where column_1 not in (select column_1 from my_table 
         where column_2 ='ABC'); 
0

Если вам просто нужно ID2, вы можете использовать group by и having:

select t2.column_1 
from t 
group by t2.column_1 
having count(*) <> (select count(distinct t2.column_2) from t t2); 

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

0

Вы можете использовать запрос следующим образом:

with ids (v1) as 
(select distinct v1 from Mytable), 
vals (v2) as 
(select distinct v2 from Mytable), 
allCombs as 
(select v1, v2 from ids, vals) 
select * from allCombs c 
where not exists (select * from myTable t where c.v1 = t.v1 and c.v2 = t.v2); 
0

Если вы хотите, чтобы все все column_1, которые не имеют одного из списка вы можете сделать это в общем случае, как это.

-- first make the list 
with items_2_find as 
(
    SELECT 'ABC' as V 
    UNION ALL 
    SELECT 'XYZ' as V 
    UNION ALL 
    SELECT 'QWE' as V 
) 
-- left join and find missing 
SELECT items_2_find.V 
FROM items_2_find 
LEFT JOIN aTable ON items_2_find.V = aTable.Column_2 
WHERE aTable.Column_1 is null