SQL НЕ СУЩЕСТВУЕТ, возвращая повторяющееся значение в результатах запроса

Привет. Кажется, из этого кода sql получаются дубликаты, которые предполагают поиск записей в Данных BO, которых нет в Данных заказа с помощью следующего ключа Keyorderstatus все результаты моего запроса уже находятся в Данные заказа, как можно ли решить эту проблему?

SELECT Keyorderstatus, 
OrderNumber, 
PartsNo, 
HoldType, 
ShiptoCode, 
BackOrderQty, 
OrderStatusCode
FROM [BO Data]
WHERE NOT EXISTS (SELECT *
                  FROM [BO Data]
                  WHERE [BO Data].Keyorderstatus = [Order Data].Keyorderstatus
                 ) 
AND [BO Data].OrderStatusCode="AWAITING_SHIPPING"
AND NOT EXISTS (SELECT *
                FROM [Order Data]
                WHERE Keyorderstatus IS NULL);

person ASTRI X285    schedule 20.03.2018    source источник
comment
Это будет сложно, так как мы понятия не имеем, как выглядят ваши данные. Попробуйте бросить DISTINCT сразу после SELECT, если вы хотите удалить дубликаты.   -  person dfundako    schedule 20.03.2018
comment
Эта строка: WHERE [BO Data].Keyorderstatus = [Order Data].Keyorderstatus использует таблицу [Данные заказа], но эта таблица не включена в ту же select, она будет дублировать данные   -  person Ricardo Pontual    schedule 20.03.2018
comment
2-й NOT EXISTS не коррелирует? И 1-й должен вернуть сообщение об ошибке, потому что он использует столбец из другой таблицы.   -  person dnoeth    schedule 20.03.2018
comment
Привет, спасибо за быстрые ответы @dfundako, где я могу использовать DISTINCT в этом коде.   -  person ASTRI X285    schedule 20.03.2018
comment
@RicardoPontual, как я могу исправить этот код таким образом, чтобы он вернул мне только правильные данные?   -  person ASTRI X285    schedule 20.03.2018
comment
@ ASTRIX285 ASTRIX285 Оставьте свой код таким же, но вместо этого используйте SELECT DISTINCT вверху. Кроме того, обратите внимание на другие комментарии к вашим утверждениям о существовании.   -  person dfundako    schedule 20.03.2018
comment
@RicardoPontual Спасибо за эту поправку, она отлично работает, я выяснил причину, по которой она дублировала записи в запросе, изначально я просил ее проверить, ГДЕ НЕ СУЩЕСТВУЕТ (ВЫБРАТЬ * ИЗ [Данные BO]», должно было быть «[Заказ Data] ', и это исправит все мои проблемы, ценю все советы по этому вопросу.   -  person ASTRI X285    schedule 21.03.2018


Ответы (1)


Как сказал @dfundako, трудно проверить без таблиц данных для тестирования.

Я думаю, что этот SQL должен делать то, что вам нужно:

SELECT        [BO Data].KeyOrderStatus
            , OrderNumber
            , PartsNo
            , HoldType
            , ShipToCode
            , BackOrderQty
            , [BO Data].OrderStatusCode
FROM        [BO Data] LEFT JOIN [Order Data] ON [BO Data].KeyOrderStatus <> [Order Data].KeyOrderStatus
WHERE       [BO Data].OrderStatusCode = 'AWAITING SHIPPING'
GROUP BY    [BO Data].KeyOrderStatus
            , [BO Data].OrderStatusCode  

Проверка [Order Data].KeyOrderStatus IS NULL может не понадобиться, поскольку (я предполагаю) [BO Data].KeyOrderStatus является первичным ключом, поэтому он всегда должен содержать значение, и SQL проверяет, отличается ли оно от значения в [данные заказа] - если оно равно NULL, оно будет отличаться от ПК.

Изменить: я добавил в другие поля, не относящиеся к соединениям. Вам придется сгруппироваться по ним.

person Darren Bartrup-Cook    schedule 20.03.2018