Return 仅来自多个 SQL 相关子查询的不同值

Return only distinct values from multiple SQL correlated sub-queries

此查询已部分完成。它 returns 1,135 行中的第 16 行。下面的错误消息表明子查询中存在重复项。

我试过插入 DISTINCTIN 语法但无济于事。任何帮助将不胜感激。

SELECT a.AAAREFNUMVALUE AS "Pro Number",
   a.AAATRANSPORTTABLE AS "Table ID",
   a.AAAREFNUMTYPE AS "Number Type",
   a.AAAPROSUFFIX AS "Pro Suffix",
   d.AAADB2Date AS "Pickup Date",
   t.AAATOBILLINGTERMID as "Billing Terms",
   t.AAAOriginTerm as "Origin Terminal",
   t.AAADestTerm as "Destination Terminal",

(SELECT a2.AAAREFNUMVALUE 
        FROM dbo.AAATOREFNUMS a2
        WHERE a2.AAATRANSPORTTABLE  = a.AAATRANSPORTTABLE  AND
                a2.AAAREFNUMTYPE = 2
        ) AS "Shippers BL#",

        (SELECT a3.AAAREFNUMVALUE 
        FROM dbo.AAATOREFNUMS a3
        WHERE a3.AAATRANSPORTTABLE  = a.AAATRANSPORTTABLE  AND
                a3.AAAREFNUMTYPE = 3
        ) AS "PO #",

        (SELECT a4.AAAREFNUMVALUE 
        FROM dbo.AAATOREFNUMS a4
        WHERE a4.AAATRANSPORTTABLE  = a.AAATRANSPORTTABLE  AND
                a4.AAAREFNUMTYPE = 8
        ) AS "SHIPPERS #"

FROM dbo.AAATOREFNUMS a 
INNER JOIN dbo.AAATODATES d ON a.AAATRANSPORTTABLE = d.AAATRANSPORTTABLE 
INNER JOIN dbo.AAATRANSPORTTABLE t ON d.AAATRANSPORTTABLE = t.RECID
WHERE AAAREFNUMTYPE = 1 ;

Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= ,>, >= or when the subquery is used as an expression.

此错误消息并不表示相关子查询中存在重复项,而是表示多个值。所以它会引发错误,因为引擎无法确定哪些值应该 returned.

您可以在子查询上添加 TOP 1 以告诉引擎每个子查询的第一个值是要 returned 的值。

SELECT a.AAAREFNUMVALUE AS "Pro Number",
   a.AAATRANSPORTTABLE AS "Table ID",
   a.AAAREFNUMTYPE AS "Number Type",
   a.AAAPROSUFFIX AS "Pro Suffix",
   d.AAADB2Date AS "Pickup Date",
   t.AAATOBILLINGTERMID as "Billing Terms",
   t.AAAOriginTerm as "Origin Terminal",
   t.AAADestTerm as "Destination Terminal",

(SELECT TOP 1 a2.AAAREFNUMVALUE 
        FROM dbo.AAATOREFNUMS a2
        WHERE a2.AAATRANSPORTTABLE  = a.AAATRANSPORTTABLE  AND
                a2.AAAREFNUMTYPE = 2
        ) AS "Shippers BL#",

        (SELECT TOP 1 a3.AAAREFNUMVALUE 
        FROM dbo.AAATOREFNUMS a3
        WHERE a3.AAATRANSPORTTABLE  = a.AAATRANSPORTTABLE  AND
                a3.AAAREFNUMTYPE = 3
        ) AS "PO #",

        (SELECT TOP 1 a4.AAAREFNUMVALUE 
        FROM dbo.AAATOREFNUMS a4
        WHERE a4.AAATRANSPORTTABLE  = a.AAATRANSPORTTABLE  AND
                a4.AAAREFNUMTYPE = 8
        ) AS "SHIPPERS #"

FROM dbo.AAATOREFNUMS a 
INNER JOIN dbo.AAATODATES d ON a.AAATRANSPORTTABLE = d.AAATRANSPORTTABLE 
INNER JOIN dbo.AAATRANSPORTTABLE t ON d.AAATRANSPORTTABLE = t.RECID
WHERE AAAREFNUMTYPE = 1 ;

但不推荐这样做,因为你不应该return那样的随机值,你应该检查哪个子查询意外地return超过一个值,并确定哪个是正确的这些多个值中的一个,修改该子查询,使其 return 成为那个子查询(例如,使用 ORDER BY)。

我建议将您的子查询转换为派生表,然后加入它们。

SELECT     a.AAAREFNUMVALUE      AS "Pro Number"
         , a.AAATRANSPORTTABLE   AS "Table ID"
         , a.AAAREFNUMTYPE       AS "Number Type"
         , a.AAAPROSUFFIX        AS "Pro Suffix"
         , d.AAADB2Date          AS "Pickup Date"
         , t.AAATOBILLINGTERMID  AS "Billing Terms"
         , t.AAAOriginTerm       AS "Origin Terminal"
         , t.AAADestTerm         AS "Destination Terminal"
         , bl.AAAREFNUMVALUE     AS "Shippers BL#"
         , po.AAAREFNUMVALUE     AS "PO #"
         , sh.AAAREFNUMVALUE     AS "SHIPPERS #"
FROM       dbo.AAATOREFNUMS      AS a
INNER JOIN dbo.AAATODATES        AS d ON a.AAATRANSPORTTABLE = d.AAATRANSPORTTABLE
INNER JOIN dbo.AAATRANSPORTTABLE AS t ON d.AAATRANSPORTTABLE = t.RECID
LEFT JOIN  (SELECT a2.AAAREFNUMVALUE FROM dbo.AAATOREFNUMS AS a2) AS bl 
    ON bl.AAATRANSPORTTABLE = a.AAATRANSPORTTABLE
   AND bl.AAAREFNUMTYPE = 2
LEFT JOIN  (SELECT a3.AAAREFNUMVALUE FROM dbo.AAATOREFNUMS AS a3) AS po 
    ON po.AAATRANSPORTTABLE = a.AAATRANSPORTTABLE
   AND po.AAAREFNUMTYPE = 3
LEFT JOIN  (SELECT a4.AAAREFNUMVALUE FROM dbo.AAATOREFNUMS AS a4) AS sh 
    ON sh.AAATRANSPORTTABLE = a.AAATRANSPORTTABLE
   AND sh.AAAREFNUMTYPE = 8
WHERE      a.AAAREFNUMTYPE = 1;