Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Teradata外部应用_Teradata_Apply_Outer Join - Fatal编程技术网

Teradata外部应用

Teradata外部应用,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

我正在将一个MS SQL代码转换为Teradata,并使用了一个没有Teradata等价物的外部应用程序。所以我在网上搜索,他们说这基本上是一个左外连接,但它可以让你有效地使用其中的子查询。 我试图转换它,但得到了不同的结果。 下面是代码

SQL

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的位)。原始代码确实是多余的,但也必须遵循。