Return 仅来自多个 SQL 相关子查询的不同值
Return only distinct values from multiple SQL correlated sub-queries
此查询已部分完成。它 returns 1,135 行中的第 16 行。下面的错误消息表明子查询中存在重复项。
我试过插入 DISTINCT
和 IN
语法但无济于事。任何帮助将不胜感激。
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;
此查询已部分完成。它 returns 1,135 行中的第 16 行。下面的错误消息表明子查询中存在重复项。
我试过插入 DISTINCT
和 IN
语法但无济于事。任何帮助将不胜感激。
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;