SQL:联合2个表然后加入另一个表。有没有更好的方法呢?

时间:2014-03-26 14:12:41

标签: mysql sql join union-all

我必须维护一个应用程序谁的数据库有点乱,我有以下挑战加入3个表:

表1 时间戳,ZID,AAA

表2 时间戳,ZID,BBB

表3 ID,一些,另一方面,数据

因此,表1和表2需要在其时间戳列上进行连接和排序。我还需要保留table1的aaa和table2的bbb列,并能够区分它是aaa还是bbb。然后我需要通过他们的zid列将它连接到另一个表。

这是我的工作sql:

SELECT *

FROM 
    table3
    LEFT JOIN
    (
    SELECT  table1.timestamp AS timestamp, 
        table1.zid, 
        table1.aaa AS responses,
        'aaas'
    FROM table1

    UNION ALL
    SELECT  table2.timestamp AS timestamp, 
        table2.zid,
        table2.aaa AS responses,
        'bbbs'
    FROM table2

    ) aaasAndbbbs ON table3.id = aaasAndbbbs.zid

ORDER BY timestamp ASC;

上面的sql正是我想要的,但我想知道是否有更好的方法。在这里,我使用" aaas"列,以区分它是aaa还是bbb-这似乎有点hacky。有没有更好的方法来做我想要的事情?

1 个答案:

答案 0 :(得分:0)

另一种方法是单独执行每个操作,您将看到表3的LEFT JOIN重复。但我怀疑,如果你看看你的版本和我的版本的执行计划,它们将是相同的。 SQL Server Optimiser应该足够聪明,以确定两者都在做同样的事情,因此以相同的方式执行它们。我觉得这比你的可读性略高,但这是我的偏好!

SELECT  table1.timestamp AS timestamp, 
    table1.zid, 
    table1.aaa AS responses,
    'aaas'
FROM table3 
LEFT JOIN table1 on table3.id = table1.zid

UNION

SELECT  table2.timestamp AS timestamp, 
    table2.zid,
    table2.aaa AS responses,
    'bbbs'
FROM table3
LEFT JOIN table1 on table3.id = table2.zid
ORDER BY timestamp ASC;