我在使用“IN”运算符从另一个数据库获取数据时遇到了问题。我需要帮助来解决这个问题。
我的查询如下所示:
SELECT i.EXTERNAL_CODE, tc.SITE_NAME, tr.TRANSACTION_DT
FROM app4_starlims_data.dbo.INVENTORY i
JOIN app4_starlims_data.dbo.VA_TUBE_COLLECTION tc
ON tc.INVENTORYID = i.INVENTORYID
JOIN app4_starlims_data.dbo.INVENTORY_TRANSACTIONS it
ON it.INVENTORYID = i.INVENTORYID
JOIN app4_starlims_data.dbo.transactions tr
ON tr.TRANSACTION_ID = it.TRANSACTION_ID
WHERE i.EXTERNAL_CODE IN
(SELECT vacutainer_ref, quality, [timestamp]
FROM dna_lab_biospecimen.dbo.blood_sample
WHERE quality LIKE '%under%'
AND [timestamp] BETWEEN '02-19-2021' AND '03-07-2021')
我收到的错误是:
查找错误 - SQL Server 数据库错误:当未使用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。
答案1
IN
您在子句中使用了带运算符的子查询,WHERE
该子查询仅允许返回一个列值。请将子查询的SELECT
语句列调整为仅需要返回的列(例如vacutainer_ref
)。
SQL 查询
SELECT i.EXTERNAL_CODE
,tc.SITE_NAME
,tr.TRANSACTION_DT
FROM app4_starlims_data.dbo.INVENTORY i
JOIN app4_starlims_data.dbo.VA_TUBE_COLLECTION tc ON tc.INVENTORYID = i.INVENTORYID
JOIN app4_starlims_data.dbo.INVENTORY_TRANSACTIONS it ON it.INVENTORYID = i.INVENTORYID
JOIN app4_starlims_data.dbo.transactions tr ON tr.TRANSACTION_ID = it.TRANSACTION_ID
WHERE i.EXTERNAL_CODE IN (
SELECT vacutainer_ref
FROM dna_lab_biospecimen.dbo.blood_sample
WHERE quality LIKE '%under%'
AND [timestamp] BETWEEN '02-19-2021'
AND '03-07-2021'
);
支持资源
-
子查询受到以下限制:
用比较运算符引入的子查询的选择列表只能包含一个表达式或列名(除了
EXISTS
and 分别IN
对SELECT *
或列表进行操作)。由于它们必须返回单个值,因此由未修改的比较运算符(后面没有关键字
ANY
or 的运算符ALL
)引入的子查询不能包含GROUP BY
andHAVING
子句EXISTS
按照惯例,以 引入的子查询的选择列表有一个星号 (*
),而不是单个列名。以 引入的子查询的规则与EXISTS
标准选择列表的规则相同,因为以 引入的子查询EXISTS
会创建存在性测试并返回TRUE
或FALSE
,而不是数据。
答案2
请忽略我的问题:
我的错误是我没有意识到子查询返回多行。