Как получить два значения из подзапроса, который будет использоваться в предложении where в SQL - PullRequest
0 голосов
/ 08 апреля 2019

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

SELECT 
    o.EMAIL_ADDRESS, c.FIRST_NAME, p.PARTY_ID
FROM 
    ORDER o WITH (NOLOCK) 
INNER JOIN  
    PARTY p WITH (NOLOCK) ON o.ORDER_ID = p.PARTY_ID 
INNER JOIN 
    CUSTOMER c WITH (NOLOCK) ON p.PARTY_ID = c.CUSTOMER_ID 
WHERE 
    (o.EMAIL_ADDRESS, c.CUSTOMER_ID) IN (SELECT EMAIL_ADDRESS, CUSTOMER_ID 
                                         FROM CUSTOMER_MASTER 
                                         WHERE insert_date > '01/02/2019')

Проблема, с которой я сталкиваюсь, заключается в том, что первое значение в предложении where, o.EMAIL_ADDRESS, выдает следующую ошибку:

Выражениене-логического типа, указанного в контексте, где ожидается условие

Когда я использую одно значение в предложении where, оно работает нормально.

Ответы [ 3 ]

2 голосов
/ 08 апреля 2019

Один метод с EXISTS и коррелированным подзапросом.

SELECT o.EMAIL_ADDRESS, c.FIRST_NAME, p.PARTY_ID
FROM ORDER_HEADER oh  WITH (NOLOCK) 
INNER JOIN  PARTY p WITH (NOLOCK) ON o.ORDER_ID = p.PARTY_ID 
INNER JOIN CUSTOMER c WITH (NOLOCK) ON p.PARTY_ID = c.CUSTOMER_ID 
WHERE EXISTS(
    SELECT 1
    FROM CUSTOMER_MASTER AS cm
    WHERE cm.insert_date > '01/02/2019'
    AND o.EMAIL_ADDRESS = cm.EMAIL_ADDRESS
    AND c.CUSTOMER_ID = cm.c.CUSTOMER_ID
    );
0 голосов
/ 08 апреля 2019

Используйте EXISTS.Я бы также посоветовал исправить формат даты:

SELECT o.EMAIL_ADDRESS, c.FIRST_NAME, p.PARTY_ID
FROM ORDER o JOIN
     PARTY p 
     ON o.ORDER_ID = p.PARTY_ID JOIN
     CUSTOMER c 
     ON p.PARTY_ID = c.CUSTOMER_ID 
WHERE EXISTS (SELECT 1
              FROM CUSTOMER_MASTER cm
              WHERE cm.EMAIL_ADDRESS = o.EMAIL_ADDRESS AND
                    cm.CUSTOMER_ID = c.CUSTOMER_ID AND
                    cm.insert_date > '2019-02-01'
             );

Ваши константы даты должны быть в формате ГГГГММДД.

Однако, исходя из вашей логики, я не думаю, что вам нужны всеJOIN s:

SELECT o.EMAIL_ADDRESS, c.FIRST_NAME, o.ORDER_ID
FROM ORDER o JOIN
     CUSTOMER c 
     ON o.ORDER_ID = c.CUSTOMER_ID 
WHERE EXISTS (SELECT 1
              FROM CUSTOMER_MASTER cm
              WHERE cm.EMAIL_ADDRESS = o.EMAIL_ADDRESS AND
                    cm.CUSTOMER_ID = c.CUSTOMER_ID AND
                    cm.insert_date > '2019-02-01'
             );

Таблица PARTY не кажется необходимой, поскольку заказы могут быть приведены в соответствие непосредственно с клиентами.

0 голосов
/ 08 апреля 2019

in разрешает только один столбец списка. Так создайте один столбец.

SELECT o.EMAIL_ADDRESS, c.FIRST_NAME, p.PARTY_ID
FROM ORDER o  WITH (NOLOCK) 
INNER JOIN  PARTY p WITH (NOLOCK) ON o.ORDER_ID = p.PARTY_ID 
INNER JOIN CUSTOMER c WITH (NOLOCK) ON p.PARTY_ID = c.CUSTOMER_ID 
WHERE o.EMAIL_ADDRESS + cast(c.CUSTOMER_ID as varchar) 
IN (select EMAIL_ADDRESS + cast(CUSTOMER_ID as varchar)
from CUSTOMER_MASTER where insert_date > '01/02/2019')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...