我得到了错误
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
在下面的查询中
select case
when serial_number like ('550092%') then
(select distinct left(product, 6) from dbo.QS_WIP_Errors2 err
where err.SERIAL_NUMBER = serial_number)
--err.SERIAL_NUMBER in (SERIAL_NUMBER))
else left(SERIAL_NUMBER,6)
end as Identnummer
from dbo.QS_defects def
where INSPECT_TIME >= '2015-08-01' and INSPECT_TIME <= '2015-08-10'
(我也试过评论中的代码) 我真的无法解释它,因为我认为通过选择一个不同的值可以返回不超过一行。 我做错了什么?
答案 0 :(得分:0)
如果serial_number
实际上是您认为的每个产品唯一的,那么即使Serial_Number
是唯一的,您获得多行的原因是因为您没有正确地对列进行别名。总而言之,你有:
SELECT ( select distinct left(product, 6)
from dbo.QS_WIP_Errors2 err
where err.SERIAL_NUMBER = serial_number) -- NO ALIAS ON serial_number
FROM dbo.QS_defects def
在您的相关子查询中,您对serial_number
的第二个引用没有别名,这意味着它是否引用外部表(def
)或内部表({{ 1}})。在名称冲突的情况下,SQL Server将假定您的意思是内部表,因此您基本上具有:
err
当然会返回所有行,因为一切都等于自己。快速演示该问题:
WHERE err.serial_number = err.serial_number
此输出显示“Test 1”和“Test 2”都作为相关名称返回:
DECLARE @T TABLE (ID INT, Name VARCHAR(20));
INSERT @T (ID, Name) VALUES (1, 'Test 1'), (2, 'Test 2');
SELECT *
FROM @T AS T1
OUTER APPLY
( SELECT CorrelatedName = Name
FROM @T AS T2
WHERE T2.ID = ID
) AS T3
WHERE T1.ID = 1;
使用正确的别名,您只能获得一行:
ID Name CorrelatedName
----------------------------------
1 Test 1 Test 1
1 Test 1 Test 2
所以你的最终查询应该是:
DECLARE @T TABLE (ID INT, Name VARCHAR(20));
INSERT @T (ID, Name) VALUES (1, 'Test 1'), (2, 'Test 2');
SELECT *
FROM @T AS T1
OUTER APPLY
( SELECT CorrelatedName = Name
FROM @T AS T2
WHERE T2.ID = T1.ID
) AS T3
WHERE T1.ID = 1;
ID Name CorrelatedName
----------------------------------
1 Test 1 Test 1
这需要多一点努力,但是当我编写查询时,我将符合所有内容 1 ,这样就可以立即清楚每列的表格,这样的错误变得更容易被发现。
<子> 1。如果它是一个简单的从一个表中选择我可能不会打扰别名或限定列引用,尽管我仍然尝试这样做,以防万一我需要在以后添加表 子>