2015-06-09 3 views
0

У меня есть запрос, который проверяет, существует ли хотя бы одна строка в трех таблицах A, B и C, где я хочу сделать проверку, что theDate = myDate. Я хочу видеть, содержат ли таблицы данные за определенную дату (myDate). Я хочу, чтобы переменная myDate была выбрана пользователем при запуске запроса. Как мне это сделать? FYI: Я использую Teradata:Переменная, заданная пользователем при запуске запроса, Teradata

запрос:

SELECT 'A' AS "Table", CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END AS "True?" 
WHERE EXISTS (SELECT * FROM A WHERE theDate=myDate) 

UNION ALL 

SELECT 'B', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END 
WHERE EXISTS (SELECT * FROM B WHERE theDate=myDate) 

UNION ALL 

SELECT 'C', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END 
WHERE EXISTS (SELECT * FROM C WHERE theDate=myDate) 

ответ

0

Я думаю, динамическая процедура/Macro будет лучше свита ваше требование. Скомпилирует ниже процедуру:

REPLACE PROCEDURE your_proc (IN in_mydate DATE) 
READS SQL DATA 
DYNAMIC RESULT SETS 1 
BEGIN 
DECLARE stmt_str VARCHAR(60000); 
DECLARE RESPONSE CURSOR WITH RETURN ONLY TO CLIENT FOR STMT; 

----------------------------------------------------------------------------------------------- 
-------------------------------- PROGRAM LOGIC ------------------------------------------------ 
----------------------------------------------------------------------------------------------- 

     SET stmt_str =   'SELECT ''A'' AS "Table", CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END AS "True?"' 
           ||'WHERE EXISTS (SELECT * FROM A WHERE theDate='''||in_mydate||''')' 
           ||'UNION ALL' 
           ||'SELECT ''B'', CASE WHEN COUNT(*) = 1 THEN ''Y'' ELSE ''N'' END' 
           ||'WHERE EXISTS (SELECT * FROM B WHERE theDate='''||in_mydate||''') ' 
           ||'UNION ALL' 
           ||'SELECT ''C'', CASE WHEN COUNT(*) = 1 THEN ''Y'' ELSE ''N'' END' 
           ||'WHERE EXISTS (SELECT * FROM C WHERE theDate='''||in_mydate||''');'; 



PREPARE STMT FROM stmt_str; 
OPEN RESPONSE; 
DEALLOCATE PREPARE STMT; 

END; 

После этого в вызове заявления просто поставить дату (в качестве входного параметра). Результат будет результатом запроса выбора, который вы желаете.

В случае, если вы используете макрос ниже код даст вам результат:

 REPLACE MACRO your_macro (mydate DATE) 
     AS (
     SELECT 'A' AS "Table", CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END   AS "True?" 
     WHERE EXISTS (SELECT * FROM A WHERE theDate=:myDate) 

     UNION ALL 

     SELECT 'B', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END 
     WHERE EXISTS (SELECT * FROM B WHERE theDate=:myDate) 

     UNION ALL 

     SELECT 'C', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END 
     WHERE EXISTS (SELECT * FROM C WHERE theDate=:myDate); 
     ); 

Благодарность

0

Вы можете оставить ваш «переменный» в одной строке летучей таблицы, и присоединиться к этому таблица в вашем запросе:

create volatile table varTable 
as (select <your date value> as thedate) 
with data 
on commit preserve rows 
; 

SELECT 'A' AS "Table", 
CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END AS "True?" 
from 
a inner join vartable 
    on a.<date column> = vartable.thedate 
0

Я нашел, на мой взгляд, легкое решение, которое работает очень хорошо. ? theDate является vaiable, который устанавливается пользователем перед запуском запроса. (Проблема для меня с другими решениями заключается в том, что у меня нет доступа к созданию хранимой процедуры или макроса)

SELECT 'A' AS "Table", CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END AS "True?" 
WHERE EXISTS (SELECT * FROM A WHERE theDate=?theDate) 

UNION ALL 

SELECT 'B', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END 
WHERE EXISTS (SELECT * FROM B WHERE theDate=?theDate) 

UNION ALL 

SELECT 'C', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END 
WHERE EXISTS (SELECT * FROM C WHERE theDate=?theDate) 
Смежные вопросы