Как вернуть условие соответствия отдельных строк - PullRequest
0 голосов
/ 03 октября 2019

У меня есть пример таблицы в формате ниже с примерами данных:

= cust_table

Customer:  Liked_Color:
Adam       Blue    
Adam       Green    
Adam       Yellow    
Adam       Red    
Bob        Yellow    
Bob        Yellow    
Bob        Yellow    
Bob        Yellow    
Charlie    Red    
Charlie    Red    
Charlie    Red    
Charlie    Red

Как я могу выбрать отдельных клиентов и вернуть их только в том случае, если им НЕ нравится цветСиний?

Итак, возвращаемые результаты будут:

Заказчик: Боб, Чарли

Если я сделаю:

SELECT DISTINCT Customer
FROM cust_table
WHERE Liked_Color NOT LIKE Blue

Я получу: АдамБоб, Чарли

Как я могу убедиться, что Клиент возвращается только тогда, когда Blue не является Liked_Color для Клиента?

Ответы [ 3 ]

1 голос
/ 03 октября 2019

Я бы использовал агрегацию:

select customer
from cust_table
group by customer
having sum(case when color = 'Blue' then 1 else 0 end) = 0;

Однако таблица customer должна иметь одну строку для каждого клиента (по крайней мере, за единицу времени). Если бы у вас была такая таблица и таблица customer_colors, я бы использовал not exists:

select c.*
from customers c
where not exists (select 1
                  from customer_colors cc
                  where cc.customer = c.customer and cc.color = 'Blue'
                 );

Это также вернуло бы клиентов без какого-либо предпочтительного цвета, чего вы не можете сделать с одной таблицей. .

0 голосов
/ 03 октября 2019

это будет работать самое простое из них:

select distinct a from Table1 where a not in 
(select distinct a from Table1 where b like 'Blue');

проверить скрипку: http://sqlfiddle.com/#!9/7034f/10

0 голосов
/ 03 октября 2019

В качестве альтернативы, посмотрите, насколько полезны наборы:

SQL> with cust (customer, liked_color) as
  2    (select 'Adam'   , 'Blue'   from dual union all
  3     select 'Adam'   , 'Green'  from dual union all
  4     select 'Bob'    , 'Yellow' from dual union all
  5     select 'Bob'    , 'Red'    from dual union all
  6     select 'Charlie', 'Red'    from dual union all
  7     select 'Charlie', 'Red'    from dual
  8    )
  9  select customer from cust where liked_color <> 'Blue'
 10  minus
 11  select customer from cust where liked_color = 'Blue';

CUSTOME
-------
Bob
Charlie

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