Мне нужна помощь в идентификации записей, с которыми не связано определенное значение.
Необходимость: Каждая отдельная запись о клиенте может иметь несколько методов связи, например:
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
.
Любая помощь приветствуется.
Поскольку вы почти не опубликовали данных, я попытаюсь угадать вашу структуру. Предполагая, что у вас есть клиенты в одной таблице и контакты в другой с идентификатором клиента, обычно, когда вы хотите найти что-то не связанное между двумя таблицами, вы выбираете на своем клиенте, оставляете соединение на своем контакте и помещаете предложение 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)
Внутренний запрос находит всех клиентов, у которых есть запись электронной почты. Внешний запрос находит всех но этих клиентов.
Вот и все! Спасибо!
@CherylLHubert, конечно! Когда у вас будет возможность, не могли бы вы отметить ответ как правильный (щелкнув галочку)? Таким образом, будущие читатели будут знать, что делать.
Попробуйте этот запрос:
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 |
Сначала попробуйте то, что вы видели. Если это не сработает, опубликуйте вопрос с описанием того, какая часть не работает, как вы ожидали.