如何将参数传递给Teradata中的长查询

时间:2015-04-09 13:48:53

标签: sql parameter-passing teradata

我有一个有点大的查询(约8个表连接,100行sql左右),我经常使用它们来连接许多不同的数据源。我希望能够将一个参数传递给查询,以便我自己和我的团队的其他成员可以使用相同的代码库,只需更改我们正在查看的时间段。

示例代码(显然我的实际代码比这更复杂,但这些是我需要做的一些事情):

SELECT t1.* , x.col1, x.SUM_col3
FROM table1 t1
LEFT JOIN
(
    SELECT t2.col1, t3.col2, SUM(t3.col3) as SUM_col3
    FROM table2 t2
    INNER JOIN table3 t3
    ON t2.PI = t3.SI
    WHERE t3.col2 NOT LIKE :parameter1
    GROUP BY 1,2
    QUALIFY ROW_NUMBER() OVER(PARTITION BY t2.col1 ORDER BY t3.col1) = 1
) x
ON t1.col1 = x.col1
WHERE t1.START_DATE >= :parameter2

我考虑过的解决方案:

  1. 使用'?'前缀以便在运行时输入参数。我发现这种方法效率很低,因为输入的参数在运行代码后保留在代码中。
  2. 使用动态SQL创建可以调用的过程。我努力让这种方法发挥作用,因为它的预期目的似乎是相对较短的查询。
  3. 我如何能够最好地构造我的查询和代码,以便能够运行像CALL MY_QUERY(:parameter1,:parameter2)这样的方式,使其在内存中创建结果表(不太喜欢)或返回然后我可以存储或使用自己的结果集(更优选)。

1 个答案:

答案 0 :(得分:4)

你想要的是Teradata中的宏。宏几乎只是一个参数化视图,这正是你在这里谈论的。

CREATE MACRO myMacro (parameter1 VARCHAR(20), parameter2 DATE)
AS
(
    SELECT t1.* 
    FROM table1 t1
    LEFT JOIN
    (
        SELECT t2.col1, t3.col2, SUM(t3.col3)
        FROM table2 t2
        INNER JOIN table3 t3
        WHERE t3.col2 NOT LIKE :parameter1
        GROUP BY 1,2
        QUALIFY ROW_NUMBER() OVER(PARTITION BY t2.col1 ORDER BY t3.col1) = 1
    ) x
    ON t1.col1 = x.col1
    WHERE t1.START_DATE >= :parameter2;
);

要打电话:

Execute myMacro('Harold', DATE '2015-01-01');