如何 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) 即 125
行 aid
即 677
和 125
行 aid
即 1359
。同样,三个 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
我有一个查询,其中 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) 即 125
行 aid
即 677
和 125
行 aid
即 1359
。同样,三个 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