在选择查询的并集结果之后附加数据

时间:2014-05-06 07:33:47

标签: mysql sql postgresql

我有一个表,它返回路径并选择查询( result1 )....

我想获得select查询和相对路径联合的结果...确保我不想将result1存储在任何表中..

我只想要一个选择查询..

为了更清楚地解决这个问题,我举了一个例子......

我有一个名为table1的表,它存储了路径和查询,如下所示

现在我触发select查询并得到如下结果:

Path      | Query
page1     | select name from table2
page2     | select name from table3
page3     | select name from table4

我想要的是所有查询的并集结果必须附加其相对路径,因此预期结果将如下所示:

path      |   result of queries
page1     |   first query's result
page2     |   second query's result
page3     |   third query's result

所以简而言之,我想在数据(在这种情况下)附加与之相关的联合查询的结果......

1 个答案:

答案 0 :(得分:1)

看起来非常简单,只需在选择中使用假字段:

select
    'page1' as Path
    col1,
    col2
from
    table1
union all
select
    'page2' as Path
    col1,
    col2
from
    table2
union all
select
    'page3' as Path
    col1,
    col2
from
    table3

和宾果游戏,你拥有自己的数据,当你称之为数据时,你就有了“附加”数据,而且每个人都过着幸福的生活。

编辑:除非查询中有可识别的内容可用于识别它的来源,否则如果不修改查询,则无法执行此操作。如果查询中存在任何内容(即使不是您想要的内容),那么您可以将union查询用作子查询并从静态查询或CTE连接到它:

select
    p1
    c1,
    c2
from
    (
    select
        col1,
        col2,
        somethingUnique
    from
        table1
    union all
    select
        col1,
        col2,
        somethingUnique
    from
        table2
    union all
        select
        col1,
        col2,
        somethingUnique
    from
        table3
    ) subby
        join (
            select
                'Page1' as p1,
                uniqueToTable1 as identy
            from
                dual
            union all
            select
                'Page2' as p1,
                uniqueToTable2 as identy
            from
                dual
            union all
            select
                'Page3' as p1,
                uniqueToTable3 as identy
            from
                dual
            ) pages
                on subby.somethingUnique=pages.identy
    )

如果每个表的唯一值(假设它在那里)是相当静态的,那么你可以在外部查询中使用简单的case语句而不是加入静态选择。

编辑2:

我确实想到了另一种可以实现的方法,但是将查询单独作为子查询运行,将输出结合起来(这很丑陋,但至少可能:

select
    'page1' as page
    col1,
    col2
from
    (
        select
            col1,
            col2
        // etc your first query that you would union
    )
union all
select
    'page2' as page
    col1,
    col2
from
    (
        select
            col1,
            col2
        // etc your second query that you would union
    )
// and so on...