这是一个非常简单的问题。
INSERT INTO crm.dbo.UPDATE_DATA(NAME,OLD_ID)
VALUES (
( SELECT s.NAME FROM crm.dbo.SURROGATE as s
INNER JOIN crm.dbo.UPDATE_DATA ON (s.ID != crm.dbo.UPDATE_DATA.OLD_ID)
WHERE crm.dbo.UPDATE_DATA.OLD_ID IS NULL
),
( SELECT SURROGATE.ID FROM crm.dbo.SURROGATE
LEFT JOIN crm.dbo.UPDATE_DATA ON (crm.dbo.SURROGATE.ID = crm.dbo.UPDATE_DATA.OLD_ID)
WHERE crm.dbo.UPDATE_DATA.OLD_ID IS NULL
)
)
当我执行上面的查询时,会出现以下错误
子查询返回的值超过1。这是不允许的 子查询跟随=,!=,<,< =,>,> =或当子查询用作 表达。
我可以理解错误,子查询返回多行,另一方面它逐行插入。
它的解决方案是什么?通过应用内连接而不是左连接,它不会通过错误。所以问题是为什么它的解决方案是内部联接。为什么不是别的。我不想在其上应用内部联接。并抱歉大量的内容。但是提前谢谢
答案 0 :(得分:1)
使用select语句插入时不要使用值。改为使用Join语句。因为使用值时,一次只能提供一组。也许试试这个
INSERT INTO crm.dbo.UPDATE_DATA(NAME,OLD_ID)
SELECT SURROGATE.name,SURROGATE.ID FROM crm.dbo.SURROGATE
LEFT JOIN crm.dbo.UPDATE_DATA ON (crm.dbo.SURROGATE.ID = crm.dbo.UPDATE_DATA.OLD_ID)
WHERE crm.dbo.UPDATE_DATA.OLD_ID IS NULL
答案 1 :(得分:1)
错误意味着您将单个结果值的结果视为单个插入命令的列的内容
但是看你的代码,你可以起诉一个简单的插入选择,只有一个选择列的结果,例如:
Insert Into crm.dbo.UPDATE_DATA(NAME,OLD_ID)
select s.NAME, s.ID
from crm.dbo.SURROGATE as s
inner join crm.dbo.UPDATE_DATA on s.ID!=crm.dbo.UPDATE_DATA.OLD_ID
where crm.dbo.UPDATE_DATA.OLD_ID is null