如何 select 子查询中的多个项目 SQL 服务器

How to select multiple items in a subquery SQL Server

我有一个查询,其中 select 多个项目使用子查询作为:

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) 即 125aid677125aid1359。同样,三个 aid 的输出(例如)应该是 191 行,但它给出 573 行(191 * 3),即每个 [=15 的 191 行=].
请帮助了解如何修改此查询。
谢谢!

如果您在子查询中引用来自外部查询的列,就会发生这种情况,因此子查询实际上是无用的,因为它始终为真。确保您始终为子查询中的 table 和列使用设置别名,以便您知道实际引用了哪些列。

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

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

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