2016-11-17 2 views
-1

У меня есть это:SQL IsNull с SELECT, подзапрос в запросе

ISNULL(FPONO.[Replan Ref_ No_],(SELECT DISTINCT PO.[Replan Ref_ No_] 
FROM NAV_Vermorel_Live.dbo.[SC Vermorel SRL$Production Order] AS PO 
WHERE SH.[External Document No_] = PO.[Old Prod_ Order No_] AND PO.[Source No_] = SL.No_)) 

Эта часть SQL является частью большой стены текста, который работает без проверки IsNull. С помощью IsNUll выводится ошибка ниже. Может ли кто-нибудь указать мне в правильном направлении? У меня есть нуль в этом конкретном столбце, и я могу получить правильные результаты из другой таблицы. Я не знаю, как это сделать.

Подзапрос возвратил более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

SELECT SL.[Document No_], 
SL.[Sell-to Customer No_], 
SL.Type, 
SL.[Line No_], 
ISNULL(FPONO.[Replan Ref_ No_],(SELECT DISTINCT PO.[Replan Ref_ No_] 
           FROM NAV_Vermorel_Live.dbo.[SC Vermorel SRL$Production Order] AS PO 
           WHERE SH.[External Document No_] = PO.[Old Prod_ Order No_] AND PO.[Source No_] = SL.No_)), 
SL.No_, 
SL.[Location Code], 
SL.[Posting Group], 
SL.[Shipment Date], 
SL.Description, 
SL.[Unit of Measure], 
SL.Quantity, 
SL.[Outstanding Quantity], 
SL.[Qty_ to Invoice], 
SL.[Qty_ to Ship], 
SL.[Unit Price], 
SL.Amount, 
SL.[Net Weight], 
SL.[Outstanding Amount], 
SL.[Qty_ Shipped Not Invoiced], 
SL.[Quantity Shipped], 
SL.[Quantity Invoiced], 
SL.[Gen_ Prod_ Posting Group], 
SL.[Line Amount], 
SL.[Item Category Code], 
SL.[Requested Delivery Date], 
SL.[Shipping Time], 
SL.[Piece Index], 
SL.Urgenta, 
SL.[Document Type], 
SH.[External Document No_], 
Cust.Name 
FROM NAV_Vermorel_Live.dbo.[SC Vermorel SRL$Sales Line] AS SL 
INNER JOIN NAV_Vermorel_Live.dbo.[SC Vermorel SRL$Sales Header] AS SH ON SL.[Document No_] = SH.No_ 
INNER JOIN NAV_Vermorel_Live.dbo.[SC Vermorel SRL$Customer] AS Cust ON SL.[Sell-to Customer No_] = Cust.No_ 
left JOIN (SELECT 
      RE1."Entry No_", 
      RE1."Item No_", 
      RE1."Quantity (Base)", 
      RE1."Source Subtype", 
      RE1."Source ID", 
      RE1."Source Type", 
      RE1."Source Ref_ No_", 
      RE2."Source Ref_ No_" AS SRN, 
      RE2."Source ID" As SalesOrder, 
      PO.[Replan Ref_ No_] 
      FROM NAV_Vermorel_Live.dbo."SC Vermorel SRL$Reservation Entry" AS RE1 JOIN NAV_Vermorel_Live.dbo."SC Vermorel SRL$Production Order" AS PO 
      ON RE1."Source ID" = PO.No_ 
      right JOIN (SELECT 
         RE."Entry No_", 
         RE."Item No_", 
         RE."Quantity (Base)", 
         RE."Source Subtype", 
         RE."Source ID", 
         RE."Source Ref_ No_" 
         FROM NAV_Vermorel_Live.dbo."SC Vermorel SRL$Reservation Entry" AS RE 
         WHERE RE."Source Subtype"=1 AND RE.[Source Type] = 37) AS RE2 ON RE1.[Entry No_] = RE2.[Entry No_] 
      WHERE (RE1."Source Type" = 5406 OR RE1."Source Type" = 5407) AND (RE1."Source Subtype" = 2 OR RE1."Source Subtype" = 3)) AS FPONO 
    ON (SL.[Document No_] = FPONO.[SalesOrder]) 
     AND (FPONO."SRN" = SL.[Line No_]) 
     AND (FPONO.[Item No_] = SL.[No_]) 
WHERE (SL.[Outstanding Quantity] > 0) 
    AND (SL.[Location Code] = 'MACH FIN' 
     OR SL.[Location Code] = 'MAGAZIN NC' 
     OR SL.[Location Code] = 'MARFURI') 
+1

https://stackoverflow.com/help/mcve – jarlh

+0

Вы также можете сделать 'Top 1' и заказать его так, как вы хотите, во внутреннем операторе select. –

+0

TOP выполнит, но что будет выбрано? – jarlh

ответ

1

Вывод прост: можно найти более чем один [Replan Ref_ No_] за [Old Prod_ Order No_] и [Source No_] в вашей таблице [SC Vermorel SRL$Production Order].

Либо убедитесь, что ваша таблица не содержит дубликатов (с уникальным ограничением) или изменить подзапрос, чтобы вернуть только одно значение, например. заменить

SELECT DISTINCT PO.[Replan Ref_ No_] 

с

SELECT MIN(PO.[Replan Ref_ No_]) 
+0

Спасибо! Работает! Некоторое количество NULL осталось, ofc, они не могут быть найдены, я могу сделать ISNULL ((ISNULL SQL BLA BLA), «ERROR»)? –

+0

Да, вы можете вложить его в гнездо. Более типичным было бы использовать «COALESCE», который получит вам первое ненулевое значение: 'coalesce (textvalue, (выберите other_textvalue from ...), 'ERROR')'. –

0

Вы также должны быть в состоянии использовать верхний 1 в вашем запросе к югу.

+0

Я знаю, что ваша репутация ограничивает вас комментариями, но в будущем дайте полный ответ, а не только комментарий. –

+0

Чтобы выбрать произвольную строку - и скрыть реальную проблему ... – jarlh

+0

WEI_DBA Я ответил на вопрос в одно и то же время. –