0

我有一个通常会出现的查询

SELECT * 
FROM BILL_HISTORY a

JOIN 
(
Sel *
from SERVICE_INFO

Qualify Row_Number() OVER (PARTITION BY Service, Product_Code1, 
Product_Code2 ORDER BY Effective_Date1 DESC, Effective_Date2 DESC) = 1
) b
ON a.SERVICE = b.SERVICE

预期结果集是过去 6 个月的发票以及来自 SERVICE_INFO 的附加列。如果我在特定服务 ID 上使用 WHERE 子句手动运行此查询,我会收到预期的结果。但是,如果我运行包含在 CREATE VOLATILE TABLE ... AS (SELECT * ... ) 中的相同查询,那么当我查询相同的服务 ID 时,我只会收到该服务的最新发票 ID。

为什么会发生这种情况?如果我将表创建为 perm 或 volatile,结果相同。真正让人头疼的...

编辑:显示在 JOIN 上进行的一般子查询,因为这似乎与问题的原因有关。

4

1 回答 1

0

虽然我不确定发生这种情况的原因,但我能够通过首先将针对连接表的子查询放入其自己的易失性表中,然后完成原始查询的连接来解决问题。

代替

JOIN 
 (
 Sel *
 from SERVICE_INFO

 Qualify Row_Number() OVER (PARTITION BY Service, Product_Code1, 
 Product_Code2 ORDER BY Effective_Date1 DESC, Effective_Date2 DESC) = 1
 ) b

第一的

 Create Multiset Volatile Table SERVICE_INFO_VT AS (
 Sel *
 from SERVICE_INFO

 Qualify Row_Number() OVER (PARTITION BY Service, Product_Code1, 
 Product_Code2 ORDER BY Effective_Date1 DESC, Effective_Date2 DESC) = 1

然后完成原始查询

 SELECT * 
 FROM BILL_HISTORY a

 JOIN SERVICE_INFO_VT b
 ON a.SERVICE = b.SERVICE

无论是作为手动查询运行还是围绕 CREATE TABLE / VOLATILE TABLE 语句运行,它都会返回相同的结果

于 2018-10-29T12:32:33.603 回答