2016-10-18 5 views
0

Я пытаюсь удалить все строки столбца значений A, где столбец B = 'S'. Вот пример, который я мог бы показать с данными:Исключение строк из результатов запроса на основе значения столбца

column A column B 
    100   S 
    100   P 
    100   C 
    101   P 
    101   C 
    102   S 
    103   C 
    104   P 

здесь, я хотел бы исключить все записи из столбца A, которые показывают «S» в колонке B (100 и 102), так что я остался с:

column A column B 
    101   P 
    101   C 
    103   C 
    104   P 

Я пытался следовать шагам от подобных SO поста (Exclude rows with a column containing a value if multiple rows exist for), но он сохранил за исключением строк, где «S» присутствовал и сохранение общих значений столбцов A.

Например, вот соответствующие части моего запроса я работаю:

select table_a.column_a 
    ,table_b.column_b 
    ,... 
from table_z 
inner join table_b 
    on table_z.z = table_b.z 
inner join table_y 
    on table_z.y = table_y.y 
left outer join table_a 
    on table_x.x = table_a.x 
where date > 'YYYY-MM-DD' 
    and (
     table_b.column_b not in (
      select column_b 
      from table_b 
      where (column_b = 'S') 
      ) 
     ) 
order by table_a.column_a 

Но он удаляет только строки, где column_b = «S» и не удаляет строки со значением column_A, что матч где column_b появляется (column_a = 100 пример с начала этого сообщения).

ответ

0
SELECT * 
    FROM YourTable 
WHERE column_A IN (SELECT column_A FROM YourTable 
        EXCEPT 
        SELECT column_A FROM YourTable 
         WHERE column_B = 'S'); 
1
Declare @YourTable table (ColumnA int,ColumnB varchar(25)) 
Insert Into @YourTable values 
(100,'S'), 
(100,'P'), 
(100,'C'), 
(101,'P'), 
(101,'C'), 
(102,'S'), 
(103,'C'), 
(104,'P') 

Select * 
From @YourTable 
Where ColumnA Not In (Select Distinct ColumnA From @YourTable where ColumnB='S') 

Возвращает

ColumnA ColumnB 
101  P 
101  C 
103  C 
104  P 
0

Я думаю, вам нужно использовать TABLE_A, не TABLE_B в вашем подзапрос в котором пункт:

select * 
from Table_A 
where Column_B != 'S' 
    and Column_A not in (
     select distinct column_A 
     from Table_A 
     where Column_B = 'S' 
     ) 

Отредактированный запрос. Это должно работать:

select table_a.column_a 
    ,table_b.column_b 
    ,... 
from table_z 
inner join table_b 
    on table_z.z = table_b.z 
inner join table_y 
    on table_z.y = table_y.y 
left outer join table_a 
    on table_x.x = table_a.x 
where date > 'YYYY-MM-DD' 
    and table_a.column_b != 'S' 
    and table_a.column_A not in (
     select distinct table_a.column_A 
     from Table_A 
     where Column_B = 'S' 
     ) 
order by table_a.column_a 
0
SELECT * 
FROM Table_A as A 
WHERE NOT EXISTS (
    SELECT * 
    FROM Table_B as B 
    WHERE B.ColumnA = A.ColumnA 
    AND B.ColumnB = 'S') 

Это очень похоже на другой ответ, за исключением того, что он использует НЕ СУЩЕСТВУЕТ, в отличие от NOT IN. Ключевое слово IN может очень полезно, но using NOT IN should be avoided для возможных причин производительности.

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