#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');