我必须维护一个应用程序谁的数据库有点乱,我有以下挑战加入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。有没有更好的方法来做我想要的事情?
答案 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;