условие предложения sql where работает не так, как ожидалось.нужны только определенные записи тегов

#sql #database #oracle

Вопрос:

Это мой запрос, я должен получить отчет о клиенте,который должен включать CUST_ID(первичный ключ), НОМЕР ТЕЛЕФОНА(обязательно), адрес электронной почты(необязательно), ЗНАЧЕНИЕ АТРИБУТА(обязательно) ОБЪЕДИНИВ 3 таблицы. Отчет должен состоять из единственных зарегистрированных клиентов, у которых есть значение АТРИБУТА = «REG» и что-либо еще. но ЗНАЧЕНИЕ ATTRIBUTE_VALUE не должно иметь «UNREG» и «ГОСТЬ»;

имя таблицы : CST_CUST_ATTRIBUTES

cust_id значение атрибута
Первый ряд
Второй ряд

имя таблицы : CST_CUST_PHONE

cust_id НОМЕР ТЕЛЕФОНА
Первый ряд
Второй ряд

имя таблицы : CST_EMAIL

cust_id ЭЛЕКТРОННАЯ ПОЧТА_ADDR
Первый ряд
Второй ряд

Ниже приведен мой запрос. Части соединений в порядке, но там, где условия предложения работают не так, как ожидалось. Я проверил записи случайным образом. Клиенты с атрибутом «НЕРЕГУЛЯРНЫЕ» и «ГОСТЕВЫЕ» также включаются в запись.

 SELECT DISTINCT
   A.CUST_ID,
   B.PHONE_NUM,
   C.EMAIL_ADDR,
   A.ATTRIBUTE_VALUE 
FROM
   CST_CUST_ATTRIBUTES A 
   INNER JOIN
      CST_CUST_PHONE B 
      ON A.CUST_ID = B.CUST_ID 
   LEFT JOIN
      CST_EMAIL C 
      ON B.CUST_ID = C.CUST_ID 
WHERE
   A.ATTRIBUTE_VALUE = 'REG' 
   and A.ATTRIBUTE_VALUE not in 
   (
      'UNREG',
      'GUEST'
   )
 

я использую oracle pl/sql developer 12.пожалуйста, нужна помощь в ожидаемом состоянии where.

Заранее благодарю вас 🙂

Комментарии:

1. Итак, cust_id может иметь более одного атрибута? Если это так, то [где.значение = reg и.cust_id не в (выберите cust_id из таблицы, где значение в (unreg, гость)]. Но это действительно зависит от ваших данных, от того, как они выглядят, и от того, что именно вы хотите.

2. приведены примерные данные и ожидаемый результат. Почему вы снова делаете левое соединение по cust_id в таблице электронной почты ?

3. @RobertoHernandez, пожалуйста, дайте решение для условия where .значение атрибута из таблицы cst_cust_attribute

Ответ №1:

Я подозреваю where , что пункт должен быть примерно таким:

 where a.attribute_value = 'REG'
  and not exists (select null
                  from cst_cust_attributes x
                  where x.cust_id = a.cust_id
                    and x.attribute_value in ('UNREG', 'GUEST')
                 )
 

Тем не менее, это довольно сложно проверить, так как образцы данных, которые вы опубликовали, довольно скудны. «ссориться»? Где «РЕДЖ» и «ГОСТЬ»?

Комментарии:

1. Большое вам спасибо, но дубликаты мобильных номеров клиентов являются coming.is есть какие-нибудь решения?

2. Понятия не имею, извини. Как я уже сказал, выборочные данные плохие . Я предлагаю вам отредактировать исходный вопрос, который вы опубликовали, и предоставить данные, иллюстрирующие проблему; тогда мы сможем оказать дальнейшую помощь.

Ответ №2:

Здесь может возникнуть проблема с учетом регистра. Вы можете попробовать —

 AND UPPER(A.ATTRIBUTE_VALUE) NOT IN ('UNREG', 'GUEST');