#mysql #sql #oracle #where-clause
Вопрос:
Я должен извлечь записи из таблицы клиентов, где тип gift_type клиента-это только «наличные», но те же самые клиенты не должны были подписываться на «купон» и «скидку».ниже приведен мой запрос, в котором не указаны точные записи. также включается более 1 типа подарка. Я также пытался использовать подзапрос, но все равно не работает.
select cust_id from customer where gift_type='cash' and gift_type != 'coupon' and gift_type != 'discount';
amp;
select cust_id
from customer c1, customer c2
where c1.gift_type='cash' and c2.gift_type != 'coupon' and c2.gift_type != 'discount';
Заранее спасибо за помощь.
Комментарии:
1. вы используете oracle или mysql ?
2. я использую oracle
Ответ №1:
select c.*
from customer as c
where c.gift_type='cash'
and not exists
(
select 1 from customer as x
where c.customer_id=x.customer_id
and x.gift_type in('coupon','discount')
)
Надеюсь, вышесказанное подходит именно вам
Ответ №2:
Вы можете сделать это при сканировании одной таблицы с помощью:
SELECT *
FROM (
SELECT c.*,
COUNT(CASE WHEN gift_type IN ('coupon', 'discount') THEN 1 END)
OVER (PARTITION BY customer_id) AS num_invalid
FROM customer c
) c
WHERE gift_type = 'cash'
AND num_invalid = 0;
Который, для выборочных данных:
CREATE TABLE customer (customer_id INT, gift_type VARCHAR(10));
INSERT INTO customer(customer_id, gift_type)
SELECT 1, 'cash' FROM DUAL UNION ALL
SELECT 1, 'coupon' FROM DUAL UNION ALL
SELECT 2, 'cash' FROM DUAL UNION ALL
SELECT 2, 'discount' FROM DUAL UNION ALL
SELECT 3, 'cash' FROM DUAL;
Выходы:
ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ ТИП ПОДАРКА NUM_INVALID 3 Наличными 0
Oracle db<>скрипка<> MySQL db<>скрипка<>
Ответ №3:
Возможно , вы захотите использовать not in
или not exists
, как вы хотите, всех клиентов, тип подарка которых-наличные, но в то же время те же самые клиенты не должны существовать в таблице для других типов подарков.
Вариант 1
select * from customer a
where a.gift_type = 'cash' and
not exists
( select 1 from customer c where a.customer_id = c.customer_id and c.gift_type in ('coupon' , 'discount' )
);
Вариант 2
select * from customer a
where a.gift_type = 'cash' and
a.customer_id not in
( select c.customer_id from customer c where a.customer_id = c.customer_id and
c.gift_type in ('coupon' , 'discount' )
);
Комментарии:
1. ключевое поле-customer_id
2. @HaameemShimar, обновлено для Oracle и ключевого поля customer_id