如何在子查询 SQL Server 中选择多个项目

Posted

技术标签:

【中文标题】如何在子查询 SQL Server 中选择多个项目【英文标题】:How to select multiple items in a subquery SQL Server 【发布时间】:2015-12-02 13:16:35 【问题描述】:

我有一个查询,它使用子查询选择多个项目:

SELECT DISTINCT A2P.aid, P.pid 
FROM sub_aminer_author2paper A2P, sub_aminer_paper P
WHERE DATALENGTH(P.p_abstract_SWR) > 0
AND P.pid IN (SELECT pid 
              FROM sub_aminer_author2paper
              WHERE p_year BETWEEN 2005 AND 2014 
              AND aid = 677
             )
AND A2P.aid = 677
ORDER BY A2P.aid  

输出如下:

aid pid  
677 812229  
677 812486  
677 818273  
677 975105  
677 1129619  
677 1626166  
677 1924898  
677 2014164  
677 2070844   

如果我对aid 使用多个值作为aid IN (SELECT aid FROM Authors)A2P.aid IN (SELECT aid FROM Authors),我希望得到相同的输出。但是如果我使用执行这个查询:

SELECT DISTINCT A2P.aid, P.pid 
FROM sub_aminer_author2paper A2P, sub_aminer_paper P
WHERE DATALENGTH(P.p_abstract_SWR) > 0
AND P.pid IN (SELECT pid 
              FROM sub_aminer_author2paper
              WHERE p_year BETWEEN 2005 AND 2014 
              AND aid IN (677, 1359)
             )
AND A2P.aid IN (677, 1359)
ORDER BY A2P.aid  

它将每个aid 的输出乘以两个aid 的输出(例如)应该是125 行,但它给出250 行(125 * 2),即@987654331 @ 行为aid677125 行为aid1359。同样,三个aid(例如)的输出应该是191 行,但它给出573 行(191 * 3),即每个191aid。 请帮助了解如何修改此查询。 谢谢!

【问题讨论】:

那个子查询的目的是什么?你为什么不加入这两张桌子? @Aツ 我必须指定时间,即 p_yearaid 这就是使用子查询的原因 但是如果你选择FROM sub_aminer_author2paper A2P JOIN sub_aminer_paper P ON P.pid=A2P.pid WHERE DATALENGTH(P.p_abstract_SWR) > 0 AND p.p_year BETWEEN 2005 AND 2014 AND aid IN (677, 1359)如果这不起作用,为什么? @Aツ 谢谢,很好用 【参考方案1】:

如果您在子查询中引用外部查询中的列,则会发生这种情况,因此子查询实际上是无用的,因为它总是正确的。确保您始终在子查询中为表和列使用别名,以便了解您实际引用的列。

您的实际问题是您正在创建一个笛卡尔积 - 实际上 sub_aminer_author2paper 和 sub_aminer_paper 之间没有连接 - 添加一个连接子句(在 WHERE 中或使用 ANSI-92 使用 INNER/OUTER JOIN)。

【讨论】:

【参考方案2】:

通过使用A的cmets,查询可以修改为:

SELECT A2P.aid, P.pid
FROM sub_aminer_author2paper A2P 
JOIN sub_aminer_paper P ON P.pid = A2P.pid 
WHERE DATALENGTH(P.p_abstract_SWR) > 0 
AND P.p_year BETWEEN 2005 AND 2014 
AND A2P.aid IN (SELECT aid FROM Authors)
ORDER BY A2P.aid

【讨论】:

以上是关于如何在子查询 SQL Server 中选择多个项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在子查询的 WHERE 子句中使用来自 UNNEST 的多个值?

SQL Server - 在子查询中使用主查询中的列

如何从SQL表中选择特定行并在SQL Server中连接多个表?

SQL Server - 在子查询中使用列别名

如何在 SQL Server 中的 UPDATE 查询的子查询中引用表变量

从多个表中创建 Sql Server VIEW GROUPing BY,选择子查询作为别名