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

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

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

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: chubert@xxx.xxx 

Клиенты могут не иметь ничего из этого или некоторых из них.

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

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

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

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

Вы можете использовать предложения 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',      'chubert@xxx.xxx' 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 |
0 голосов
/ 13 сентября 2018

Допустим, контактная информация находится в таблице 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)

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

0 голосов
/ 13 сентября 2018

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

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', 'chubert@xxx.xxx');

Демо

0 голосов
/ 13 сентября 2018

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

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