具有空值的{{S}}连接

时间:2015-12-09 06:38:27

标签: sql sql-server tsql join

我有3个表看起来像: 表1:

╔════╦═══════╗
║ id ║ name  ║
╠════╬═══════╣
║  1 ║ name1 ║
╚════╩═══════╝

表2:

╔════╦════════════╗
║ id ║   data1    ║
╠════╬════════════╣
║  1 ║ some data1 ║
║  1 ║ some data2 ║
║  1 ║ some data3 ║
╚════╩════════════╝

表3:

╔════╦═══════╗
║ id ║ data2 ║
╠════╬═══════╣
║  1 ║   456 ║
║  1 ║   345 ║
╚════╩═══════╝

结果我想得到连接表,如果某些表中没有这样的数据,那么将是空值。我希望得到这样的东西:

╔════╦═══════╦════════════╦════════╗
║ id ║ name  ║   data1    ║  data2 ║
╠════╬═══════╬════════════╬════════╣
║  1 ║ name1 ║ some data1 ║ 456    ║
║  1 ║ name1 ║ some data2 ║ 345    ║
║  1 ║ name1 ║ some data3 ║ null   ║
╚════╩═══════╩════════════╩════════╝

我无法弄清楚我该怎么做。我尝试使用外连接,但结果有重复。也许有可能使用group by或其他agregate函数?

现在我的代码是:

SELECT * FROM Table1 t1
left outer join Table2 t2 on t1.id=t2.id
left outer join Table3 t3 on t1.id=t3.id

是否有可能获得我想要的结果以及如何做到这一点?

2 个答案:

答案 0 :(得分:3)

首先,您需要将Table1的每一行复制到N次,其中N是来自Table2和{{1}的相关行的最大数量}。这可以使用计数表来完成。

然后,使用Table3ROW_NUMBERTable2添加另一个ID,并在Table3条件中使用新创建的ID:

SQL Fiddle

JOIN

答案 1 :(得分:0)

根据行号,您似乎想要FULL JOINTable2之间的Table3,然后将Table1的每一行与此{{1}的乘积合并操作:

FULL JOIN

Demo here