Teradata外部应用
我正在将一个MS SQL代码转换为Teradata,并使用了一个没有Teradata等价物的外部应用程序。所以我在网上搜索,他们说这基本上是一个左外连接,但它可以让你有效地使用其中的子查询。 我试图转换它,但得到了不同的结果。 下面是代码 SQLTeradata外部应用,teradata,apply,outer-join,Teradata,Apply,Outer Join,我正在将一个MS SQL代码转换为Teradata,并使用了一个没有Teradata等价物的外部应用程序。所以我在网上搜索,他们说这基本上是一个左外连接,但它可以让你有效地使用其中的子查询。 我试图转换它,但得到了不同的结果。 下面是代码 SQL select s.*, s2.NStartDate, s2.NextL from tDates s outer apply ( select MIN(s2.StartDate) NSta
select
s.*,
s2.NStartDate,
s2.NextL
from tDates s
outer apply (
select
MIN(s2.StartDate) NStartDate,
CAST(MIN(CAST(s2.LFL as int)) as bit) NextL
from tDates s2
where
s2.StoreNo = s.StoreNo
and s2.StartDate > s.StartDate
and s2.LFL = case s.LFL when 0 then 1 else 0 end
) s2
TERADATA
SELECT
s.*,
s2.NStartDate,
s2.NextL
FROM tDates s
LEFT OUTER JOIN
(
SELECT
s2.StoreNo,
MIN(s2.StartDate) AS NStartDate,
CAST(MIN(CAST(s2.LFL AS INTEGER)) AS BYTEINT) AS NextL
FROM tDates s2
GROUP BY
s2.StoreNo
) s2
ON s2.StoreNo = s.StoreNo
AND s2.NStartDate > s.StartDate
AND s2.NextL = CASE s.LFL WHEN 0 THEN 1 ELSE 0 END
输出
Outer Apply:
o------o---------o--------------o-------o
|StoreN| SCode | NStartDate | NextL |
o------o---------o--------------o-------o
| 1 | A | 2016-01-13 | 10 |
| 1 | A | 2016-01-12 | 20 |
| 2 | B | 2016-01-08 | 40 |
| 2 | B | 2016-01-06 | 30 |
| 3 | C | NULL | NULL |
o------o---------o--------------o-------o
Left Outer Join:
o------o---------o--------------o-------o
|StoreN| SCode | NStartDate | NextL |
o------o---------o--------------o-------o
| 1 | A | 2016-01-13 | 10 |
| 1 | A | 2016-01-12 | 20 |
| 2 | B | NULL | NULL |
| 3 | C | NULL | NULL |
o------o---------o--------------o-------o
我的转换有什么问题吗?还是错过了什么
感谢
外部应用
是微软标准SQL的横向连接的实现
,它是一种相关连接。当它返回单行(如MIN
)时,它可以被相关的标量子查询替换,每列一个,但是性能会很差
当您两次访问同一个表时,最好的重写将基于分析函数,尽管s2.LFL=case s.LFL when 0 then 1 else 0 end
有点棘手:
SELECT
s.*,
CASE
WHEN LFL=0
-- only check LFL 1 for the minimum date
THEN Min(CASE WHEN LFL = 1 THEN StartDate END)
Over (PARTITION BY StoreNo
ORDER BY StartDate
ROWS BETWEEN 1 Following AND Unbounded Following)
ELSE -- only check LFL 0 for the minimum date
Min(CASE WHEN LFL = 0 THEN StartDate END)
Over (PARTITION BY StoreNo
ORDER BY StartDate
ROWS BETWEEN 1 Following AND Unbounded Following)
END AS NStartDate,
-- repeated logic, one for each column
-- returns 0/1/NULL -> doesn't match your result set
CASE
WHEN LFL=0
THEN Min(CASE WHEN LFL = 1 THEN LFL END)
Over (PARTITION BY StoreNo
ORDER BY StartDate
ROWS BETWEEN 1 Following AND Unbounded Following)
ELSE Min(CASE WHEN LFL = 0 THEN LFL END)
Over (PARTITION BY StoreNo
ORDER BY StartDate
ROWS BETWEEN 1 Following AND Unbounded Following)
END AS NextL
FROM tDates s
这将导致解释中的单个统计步骤
根据您的评论,
LFL
是一个bit
数据类型(0/1,TRUE/FALSE),因此CAST(MIN(CAST(s2.LFL as int))作为bit)
完全没有用,并且与NextL
值(如10)不匹配。Cab您显示了一些数据和预期结果吗?我不知道如何在评论中发布图片,但我会解释。相同的记录计数,左侧列上的数据相同,但右侧列上的一些数据显示为NULL(在Teradata上)。我仍然不知道为什么原始代码使用外部应用。不要在注释中发布图片,编辑查询并添加可读数据,包括预期结果和应用逻辑的解释。外部应用仅与外部联接相似,但并不完全相同(否则您将不需要它)。添加一些基本行会有帮助,我不会将转换(MIN(CAST(s2.LFL as int))作为位)
部分(对于LFL=0和TRUE
否则返回FALSE
),LFL的数据类型是什么?LFL的数据类型是BYTEINT(SQL的位)。原始代码确实是多余的,但也必须遵循。