如何从一个或另一个连接表中获取行,然后根据前两个表的连接,进一步获取更多连接表

时间:2016-10-20 21:32:51

标签: sql sql-server join

我有三个表(a,b,c)和两个(b和c)需要连接以从第一个表a获取详细数据。但问题是我需要在一个查询中执行此操作。

如果我在同一个查询中连接两个表而没有找到记录,因为详细数据在b或c中,但从不在两者中。

为了进一步复杂化,我需要进一步加入其他表(b2,c2),基于找到的记录来自b或c。

我正在使用MS SQL。

我现在的查询是:

select a.*, b.name1, c.name1, b2.url, c2.url
  left join b on a.aID = b.aID
  left join c on a.aID = c.aID
  inner join b2 on b.bID = b2.bID
  inner join c2 on c.cID = c2.cID
where a.date > '9/1/2016'

我搜索了几天,但似乎没有人需要查询查询中的第四和第五个表格,所以找不到任何类似的答案

有没有办法做到这一点?性能不是问题,因为执行一个始终限制表a中记录的where子句后,记录数将小于1,000。

3 个答案:

答案 0 :(得分:0)

我认为Left Join会这样做,至少在第一部分是这样的:

select a.*, b.name1, c.name1
  left join b on a.aID = b.aID
  left join c on a.aID = c.aID
where a.date > '9/1/2016'

当数据在b表中时,你将获得c.name1 null,当数据在c表中时,b.name1将为null。

对于其他两个连接但不确定但是左连接也可以工作。

答案 1 :(得分:0)

一系列带有内连接的左连接作为子查询应该可以解决问题。子查询将b / b2和c / c2数据拉在一起,以便在左连接中引用:

  constructor(@Optional() private config?=new DefaultConfig(): DefaultConfig) {}

答案 2 :(得分:0)

我认为,获得相同结果更简单,更简洁:

select a.*, b.name1, c.name1, b2join.url, c2join.url
FROM a
LEFT JOIN b on a.aID = b.aID
LEFT JOIN c on a.aID = c.aID
LEFT JOIN b as b2join on b2join.bID = b.bID
LEFT JOIN a as c2join on c2join.cID = c.cID