【发布时间】:2017-07-12 04:21:14
【问题描述】:
架构:
Table A: AID(PK), RECEIVE_DATE
Table B: BID(PK), AID(FK), MESSAGE, ITEMID, ITEMTYPE
表 A 到 B 具有一对多映射。
这是一个有效的 SQL 查询(在 SQL Server 中),用于查找按 ITEMID 分组的最新消息,即针对不同的 ITEMID(ITEMTYPE 表示为“XYZ”)。
SELECT
b.MESSAGE, b.ITEMID
from a
inner join b on b.aid = a.aid AND b.ITEMTYPE = 'XYZ'
where a.receive_date in (select max(receive_date)
from a a1
inner join b b1 on b1.aid = a1.aid
where b1.itemid = b.itemid
);
我们如何在没有IN 子句的情况下重写这个 SQL 查询[也没有使用行号概念],因为 ORACLE 对 IN 子句有限制。获取 java.sql.SQLSyntaxErrorException: ORA-01795: 对于上述表达式,列表中的最大表达式数为 1000。
【问题讨论】:
-
您确定这是查询产生的错误吗? AFAIK,该限制仅在
IN子句中传递值时应用,例如a.receive_date in ('2017-01-01','2017-02-01',..) -
您可以简单地将
IN更改为=并获得相同的结果,而不是使用INNER JOIN重写查询 -
@Prdp 也许错误是由于在具有太多记录的
IN表达式中存在中间查询引起的。只是猜测。 -
IN子句有两种形式——基于值和基于子查询。该限制仅适用于他们的第一个。第二个被优化器默默地重写到一个连接上。我不相信您的查询确实返回了该错误。当子查询返回多于一列时,您可能会收到错误 - 但这是语义错误。您的子查询仅返回一个值,因此IN甚至可以被纯=替换。我认为您在发布之前“匿名”了查询,真正的问题在其他地方。 ps:使用解析函数可以避免自连接。 -
如果您的一个表有 > 1000 个分区,那么 ORA-01795 可能与此处提到的错误有关:-stackoverflow.com/a/45050530/430567(还提到了 NO_EXPAND_TABLE 提示,您可以尝试验证这是否是问题),
标签: sql sql-server oracle