【发布时间】: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 @ 行为aid 即677 和125 行为aid 即1359。同样,三个aid(例如)的输出应该是191 行,但它给出573 行(191 * 3),即每个191 行aid。
请帮助了解如何修改此查询。
谢谢!
【问题讨论】:
-
那个子查询的目的是什么?你为什么不加入这两张桌子?
-
@Aツ 我必须指定时间,即
p_year和aid这就是使用子查询的原因 -
但是如果你选择
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ツ 谢谢,很好用
标签: sql-server subquery output query-optimization