使用“EXISTS”和“IN”运算符的选择语句

使用“EXISTS”和“IN”运算符的选择语句

我在使用“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'
        );

支持资源

  • 子查询规则

    子查询受到以下限制:

    • 用比较运算符引入的子查询的选择列表只能包含一个表达式或列名(除了EXISTSand 分别INSELECT *或列表进行操作)。

    • 由于它们必须返回单个值,因此由未修改的比较运算符(后面没有关键字ANY or 的运算符ALL)引入的子查询不能包含GROUP BYandHAVING子句

    • EXISTS按照惯例,以 引入的子查询的选择列表有一个星号 ( *),而不是单个列名。以 引入的子查询的规则与EXISTS标准选择列表的规则相同,因为以 引入的子查询 EXISTS会创建存在性测试并返回TRUEFALSE,而不是数据。

答案2

请忽略我的问题:

我的错误是我没有意识到子查询返回多行。

相关内容