首页 > 解决方案 > 不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。(子查询)重复

问题描述

我对这个查询有疑问。我想做下一个:

不在同一张表中的记录,应使用另一张表添加。

DECLARE @account INT = 8825

INSERT INTO [Fleet].[dbo].[AccountsReports] ([AccountId], [ReportId], [ReportName])
    SELECT
        @account AccountId,
        [ReportId],
        [Name] 
    FROM
        [Fleet].[dbo].[Reports] 
    WHERE
        ReportId IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,54) 
        AND ReportId NOT IN (SELECT @account AccountId, [ReportId], [Name] 
                             FROM [Fleet].[dbo].[Reports] 
                             WHERE ReportId IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,54)
                            )

这显示了一个例外:

当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。

分离的查询工作正常。你能帮我了解我的问题是什么吗?

谢谢

标签: sqlsql-servertsql

解决方案


如果我理解正确,您需要使用not exists而不是NOT IN,因为IN只能比较子查询中的一列值。

如果要比较多个列,可以使用exists

看起来像这样。

insert into [Fleet].[dbo].[AccountsReports]
                            ([AccountId],
                            [ReportId],
                            [ReportName])
SELECT
    @account AccountId 
    ,[ReportId]
    ,[Name] 
FROM [Fleet].[dbo].[Reports] t1
where ReportId in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,54) and
not exists (
        SELECT
            1
        FROM [Fleet].[dbo].[Reports] t2
        WHERE t1.ReportId = t2.ReportId  and t1.Name = t2.Name
)

推荐阅读