如何将参数传递给 Teradata 中的长查询
How to pass a parameter into a long query in Teradata
我有一个比较大的查询(要连接 ~8 table,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
我考虑过的解决方案:
- 使用'?'前缀以便在 运行 时输入参数。我发现这种方法效率很低,因为输入的参数在 运行 代码之后保留在代码中。
- 使用动态 SQL 创建一个可以调用的过程。我正在努力让这种方法发挥作用,因为它的预期目的似乎是相对较短的查询。
我怎样才能最好地构建我的查询和代码,以便能够 运行 像 CALL MY_QUERY(:parameter1,:parameter2) 这样的方式创建结果table 在内存中(不太优选)或 returns 我可以自己存储或使用的结果集(更优选)。
您需要的是 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');
我有一个比较大的查询(要连接 ~8 table,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
我考虑过的解决方案:
- 使用'?'前缀以便在 运行 时输入参数。我发现这种方法效率很低,因为输入的参数在 运行 代码之后保留在代码中。
- 使用动态 SQL 创建一个可以调用的过程。我正在努力让这种方法发挥作用,因为它的预期目的似乎是相对较短的查询。
我怎样才能最好地构建我的查询和代码,以便能够 运行 像 CALL MY_QUERY(:parameter1,:parameter2) 这样的方式创建结果table 在内存中(不太优选)或 returns 我可以自己存储或使用的结果集(更优选)。
您需要的是 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');