相同的查询但不同的表

时间:2014-07-29 14:07:58

标签: sql oracle

我面对的是一个在字符串中生成并使用" OPEN pCursor FOR vQuery"执行的大查询。我试图从字符串变量中获取查询,并作为一个适当的"可编译的"查询。

我遇到这个问题,其中一个不同的表是查询,具体取决于变量

vQuery := 'SELECT ...';

IF pVar = 1 Then
    vQuery := vQuery || ' FROM table1';
ELSE
    vQuery := vQuery || ' FROM table2';
END IF

vQuery := vQuery || ' WHERE ...';

这两个表的列名几乎相同。有没有办法将其作为单个查询

OPEN Pcursorout FOR
SELECT ... FROM CASE WHEN pVar = 1 THEN table1 ELSE table1 END WHERE ...;

或者我坚持要两次查询?

IF pVar = 1 Then
    OPEN Pcursorout FOR SELECT ... FROM table1 WHERE ...;
ELSE
    OPEN Pcursorout FOR SELECT ... FROM table2 WHERE ...;
END IF

select和where部分很大,两个表都完全相同。

3 个答案:

答案 0 :(得分:3)

您可以使用UNION并使用变量pVar仅包含结果集中一个查询的结果。

SELECT t1.col1, t1.col2, ..., t1.col10
FROM table1 t1
WHERE pVar = 1 and ...
UNION
SELECT t2.col1, t2.col2, ..., t2.col10
FROM table1 t2
WHERE pVar <> 1 and ...

这并不是你所要求的 - 不需要为两个select语句提供重复的列列表 - 但我认为它可能会捕获你的意图。它将要求两个查询选择的列具有相同的数据类型,因此将存在两个查询结果的列相同的(有点弱)约束。例如,您无法将新列添加到一个查询而不能添加另一个查询。

答案 1 :(得分:2)

也许使用UNION / UNION ALL来统一两个查询?使用UNION / UNION ALL的要求是所有联合的SELECT必须返回具有相同名称的列。

所以,如果你有

SELECT t.f1, 
       t.f2, 
       t.f3
FROM   t
WHERE ...

and your other query is

SELECT q.f1,
       q.f2,
       q.f3
FROM q
WHERE ...

您可以使用UNION:

作为单个SQL语句运行
SELECT t.f1, 
       t.f2, 
       t.f3
FROM   t
WHERE ...

UNION

SELECT q.f1,
       q.f2,
       q.f3
FROM q
WHERE ...

请记住,如果需要返回存在于一个表中而不存在于另一个表中的列,则仍然可以使用UNION,只返回NULL并将列命名为与包含该列的列中的列名相对应。 / p>

答案 2 :(得分:1)

它有点像kludge,您可能需要查看性能影响,但是您可以使用内联视图来联合两个基表,每个部分上都有一个标志,然后您可以将其与变量进行比较

SELECT ...
FROM (
    SELECT 1 as var, table1.*
    FROM table1
    UNION ALL
    SELECT 2 as var, table2.*
    FROM table2
) t
WHERE t.var = pVar
AND ...;

使用内联视图意味着您不必复制主选择列表或where子句等。如果表具有不同的列,那么您可以(并且可能应该)仅选择列中的列将在外部选择列表中引用的内部查询。