SQL-запрос - найдите, где значение (где может быть несколько) не существует

Мне нужна помощь в идентификации записей, с которыми не связано определенное значение.

Необходимость: Каждая отдельная запись о клиенте может иметь несколько методов связи, например:

Cheryl Hubert has the following contact records:
Code value: 1.  
Description: home phone   
CustomerData:. 123-456-7890

Code value: 2
Description: work phone
CustomerData: 000-123-4567

Code value:3
Description: email
CustomerData: [email protected] 

У клиентов может не быть ни одного из них или некоторых из них.

Мне нужно написать запрос, чтобы найти все записи о клиентах, у которых НЕТ адреса электронной почты (кодовое значение 3). Я видел запросы с "не существует", но не уверен, что это правильный путь. Имейте в виду, что для всех контактных данных используется одно и то же имя поля (CustomerData).

Кодовое значение / описание указывает, что находится в поле CustomerData.

Любая помощь приветствуется.

Сначала попробуйте то, что вы видели. Если это не сработает, опубликуйте вопрос с описанием того, какая часть не работает, как вы ожидали.

Circle Hsiao 13.09.2018 04:21
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
240
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Поскольку вы почти не опубликовали данных, я попытаюсь угадать вашу структуру. Предполагая, что у вас есть клиенты в одной таблице и контакты в другой с идентификатором клиента, обычно, когда вы хотите найти что-то не связанное между двумя таблицами, вы выбираете на своем клиенте, оставляете соединение на своем контакте и помещаете предложение where в любой из Столбец контактов равен нулю. Если вам нужно конкретно значение 3, поместите его непосредственно в предложение соединения.

Ответ принят как подходящий

Допустим, контактная информация находится в таблице contactRecords, которая выглядит примерно так:

customerId int,    
codeValue int,
description varchar,
customerData varchar

Чтобы получить всех клиентов, у которых нет записи электронной почты (где codeValue = 3), попробуйте что-то вроде этого:

select distinct customerId
from contactRecords 
where customerId not in (
     select distinct customerId
     from contactRecords
     where codeValue = 3)

Внутренний запрос находит всех клиентов, у которых есть запись электронной почты. Внешний запрос находит всех но этих клиентов.

Вот и все! Спасибо!

Cheryl L Hubert 16.09.2018 00:12

@CherylLHubert, конечно! Когда у вас будет возможность, не могли бы вы отметить ответ как правильный (щелкнув галочку)? Таким образом, будущие читатели будут знать, что делать.

zch 17.09.2018 01:50

Попробуйте этот запрос:

select * 
from customers c
where not exists(select 1 from contact_method
                 where customer_id = c.id
                 and description = 'email');

Я предположил такую ​​схему:

create table customers(id int, name varchar(20));
insert into customers values (1, 'Cheryl Hubert');

create table contact_method (id int, customer_id int, code_value int, description varchar(20), customer_data varchar(20));
insert into contact_method values (1, 1, 1, 'home phone', '123-456-7890');
insert into contact_method values (2, 1, 2, 'work phone', '000-123-4567');
insert into contact_method values (3, 1, 3, 'email', '[email protected]');

Демо

Вы можете использовать предложения GROUP BY и HAVING, чтобы проверить:

Установка Oracle:

CREATE TABLE contact_details ( code_value, customerid, description, customerdata ) AS
  SELECT 1, 1, 'home phone', '123-456-7890' FROM DUAL UNION ALL
  SELECT 2, 1, 'work phone', '000-123-4567' FROM DUAL UNION ALL
  SELECT 3, 1, 'email',      '[email protected]' FROM DUAL UNION ALL
  SELECT 4, 2, 'home phone', '012-345-6789' FROM DUAL;

Запрос:

SELECT customerid
FROM   contact_details
GROUP BY customerid
HAVING COUNT( CASE description WHEN 'email' THEN 1 END ) = 0

Выход:

| CUSTOMERID |
|------------|
|          2 |

Другие вопросы по теме