如何在子查询 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 @ 行为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ツ 谢谢,很好用
【参考方案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表中选择特定行并在SQL Server中连接多个表?