Как поставить условия на левые соединения - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть две таблицы, CustomerCost и Products, которые выглядят следующим образом:

enter image description here

Я объединяю две таблицы, используяследующий запрос SQL:

SELECT custCost.ProductId,
       custCost.CustomerCost
FROM CUSTOMERCOST Cost
LEFT JOIN PRODUCTS prod ON Cost.productId =prod.productId
WHERE prod.productId=4
  AND (Cost.Customer_Id =2717
       OR Cost.Customer_Id IS NULL)

Результат объединения: результат объединения

Когда я передаю customerId 2717, он должен возвращать только определенныестоимость клиента, то есть 258,93, а когда идентификатор клиента не совпадает, тогда только он должен принимать стоимость как 312.50

Что я здесь не так делаю?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Вы, похоже, хотите:

SELECT c.*
FROM CUSTOMERCOST c
WHERE c.productId = 4 AND c.Customer_Id = 2717
UNION ALL
SELECT c.*
FROM CUSTOMERCOST c
WHERE c.productId = 4 AND c.Customer_Id IS NULL AND
      NOT EXISTS (SELECT 1 FROM CUSTOMERCOST c2 WHERE c2.productId = 4 AND c2.Customer_Id = 2717);

То есть возьмите соответствующую цену, если она существует для клиента.В противном случае возьмите стоимость по умолчанию.

0 голосов
/ 05 декабря 2018
SELECT custCost.ProductId,
       custCost.CustomerCost
FROM CUSTOMERCOST Cost
LEFT JOIN PRODUCTS prod
ON Cost.productId =prod.productId
  AND (Cost.Customer_Id =2717 OR Cost.Customer_Id IS NULL)
WHERE prod.productId=4

WHERE применяется к объединенной строке.ON контролирует условие соединения.

Внешние объединения - это то, почему FROM и ON были добавлены в SQL-92.Старый синтаксис SQL-89 их не поддерживал, и разные поставщики добавляли разные, несовместимые синтаксис для их поддержки.

0 голосов
/ 05 декабря 2018

Вы можете получить ожидаемый результат следующим образом:

SELECT Cost.ProductId,
       Cost.CustomerCost
FROM CUSTOMERCOST Cost
INNER JOIN PRODUCTS prod ON Cost.productId = prod.productId
WHERE prod.productId=4
  AND Cost.Customer_Id = 2717

Однако, если вы хотите, чтобы идентификатор клиента передавался как NULL, вам придется изменить последнюю строку на AND Cost.Customer_Id IS NULL,Чтобы сделать это динамически, вам нужно будет использовать переменные и сгенерировать запрос на основе ввода.

Проблема в исходном запросе, который вы опубликовали, заключается в том, что вы использовали псевдоним custCost, которыйотсутствует в запросе.

РЕДАКТИРОВАТЬ : На самом деле, вам даже не нужно объединение.Кажется, что в таблице CUSTOMERCOST указаны идентификаторы клиента и продукта.

Вы можете просто:

SELECT
    Cost.ProductId, Cost.CustomerCost 
FROM
    CUSTOMERCOST Cost
WHERE
    Cost.Customer_Id = 2717
    AND Cost.productId = 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...