Teradata SQL-CREATE表为select-表填充的结果集与手动运行查询的结果集不同

时间:2018-10-29 02:56:49

标签: sql teradata teradata-sql-assistant

我有一个查询,通常可以查询

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进行的常规子查询,因为这似乎与问题的原因有关。

1 个答案:

答案 0 :(得分: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语句返回相同的结果