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

Я пытаюсь понять, как работает выражение case when exists, есть две таблицы, одна из которых - trOrderHeader, в которой хранится основная информация о любом заказе. Другое - trOrderLine, в котором хранится информация о заказе, и есть столбец IsClosed, который указывает, что ордер как-то закрыт (отменен или завершен).

Итак, мой запрос находится ниже, и я пытаюсь получить OrderLineID сСтолбец IsClosed (я могу сделать это с помощью объединений, это легко, но я пытаюсь case when exists выражение), но весь столбец IsClosed возвращает 1;

SELECT 
    OrderLineId,
    IsClosed = 
        CASE 
        WHEN EXISTS (select * from trOrderHeader  where IsClosed=1)
        THEN    1 
        WHEN EXISTS (select * from trOrderHeader  where IsClosed=0)
        THEN   0
        END
FROM 
    trOrderLine
GROUP BY OrderLineId

Result

Разве это не так? должен дать мне, если ордер закрыт, напишите 1, если ордер не закрыт, напишите 0?

Я неправильно понял выражение case when exists?

1 Ответ

1 голос
/ 03 октября 2019

Вам необходимо сопоставить подзапросов. Если предположить, что столбец OrderId может использоваться для связи таблиц, то:

SELECT 
    OrderLineId,
    IsClosed = 
        CASE 
        WHEN EXISTS (select 1 from trOrderHeader h where h.IsClosed = 1 AND h.OrderId = l.OrderId)
        THEN    1 
        WHEN EXISTS (select 1 from trOrderHeader h where IsClosed = 0 AND h.OrderId = l.OrderId)
        THEN   0
        END
FROM trOrderLine l
GROUP BY OrderLineId

Однако логика запроса может быть упрощена с помощью JOIN и агрегатной функции для вычисления состояния. ,Примерно так может быть то, что вам нужно:

SELECT l.OrderLineId, MAX(h.isClosed) IsClosed
FROM trOrderLine l
INNER JOIN trOrderHeader h ON h.OrderId = l.OrderId
GROUP BY l.OrderLineId
...