sql-server - 从 3 个表中查询所有数据的最快方法

标签 sql-server tsql

假设我有 3 个这样的表:

表 1

|Id|Date |Data1|
|--|---- |-----|
|1 |24/05|Some1|

表 2

|Id|Date |Data2|
|--|---- |-----|
|1 |24/05|Some2|
|1 |12/06|Some2|

表 3

|Id|Date |Data3|
|--|---- |-----|
|1 |24/05|Some3|
|1 |14/06|Some3|

我怎样才能得到这样的结果:

|Id|Date |Data1|Data2|Data3|
|--|-----|-----|-----|-----|
|1 |24/05|Some1|Some2|Some3|
|1 |12/06|NULL |Some2|NULL |
|1 |14/06|NULL |NULL |Some3|

使用 MS SQL。

我想到的是

SELECT Id, Date, Data1, Data2, Data3 FROM Table1 
LEFT JOIN Table2 ON Table1.Id = Table2.Id AND Table1.Date = Table2.Date
LEFT JOIN Table3 ON Table1.Id = Table3.Id AND Table1.Date = Table3.Date
UNION 
SELECT Id, Date, Data1, Data2, Data3 FROM Table2
LEFT JOIN Table1 ON Table2.Id = Table1.Id AND Table2.Date = Table1.Date
LEFT JOIN Table3 ON Table2.Id = Table3.Id AND Table2.Date = Table3.Date
UNION 
SELECT Id, Date, Data1, Data2, Data3 FROM Table3
LEFT JOIN Table1 ON Table3.Id = Table1.Id AND Table3.Date = Table3.Date
LEFT JOIN Table2 ON Table3.Id = Table2.Id AND Table3.Date = Table2.Date

有没有更好的方式查询数据?

最佳答案

select 
    id       = coalesce(t1.id,t2.id,t3.id) 
  , [date]   = coalesce(t1.[date],t2.[date],t3.[date]) 
  , t1.Data1
  , t2.Data2
  , t3.Data3
from Table1 t1
  full join Table2 t2
    on t1.id = t2.id 
   and t1.[date]=t2.[date]
  full join Table3 t3
    on (t1.id = t3.id and t1.[date]=t3.[date])
    or (t2.id = t3.id and t2.[date]=t3.[date])

rextester 演示:http://rextester.com/ATCJ12705

返回:

+----+-------+-------+-------+-------+
| id | date  | Data1 | Data2 | Data3 |
+----+-------+-------+-------+-------+
|  1 | 24/05 | Some1 | Some2 | Some3 |
|  1 | 12/06 | NULL  | Some2 | NULL  |
|  1 | 14/06 | NULL  | NULL  | Some3 |
+----+-------+-------+-------+-------+

关于sql-server - 从 3 个表中查询所有数据的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44500749/

相关文章:

sql - 这可能与 SQL Server

tsql - 如何翻转 SQL 中的随机位

xml - SQLServer 2008R2中如何跨多行查询xml

sql-server - 在 SQL 中将一列数据显示为两列

sql - 使用 LIKE 时如何转义方括号?

sql - 使用 row_number() 时是否可以依赖输出顺序

sql-server - 确定几个邮政编码是否连续

sql-server - 如何根据列值选择真/假?

sql - 更新+使用(行锁)+ CTE

sql - 如何在 SQL Server 中使用 AXSD?