Sql 将几个表与内部表和外部表连接在一起。

Sql 将几个表与内部表和外部表连接在一起。,sql,join,inner-join,outer-join,Sql,Join,Inner Join,Outer Join,我正在尝试将内部联接和外部联接结合起来,但无法使其工作。我总共有7个表需要在一个查询中连接在一起。 首先,我只有6个,没有任何问题,因为一切都是内部连接。但现在我已经添加了第七个表,无法正确获得它。我想我需要以某种方式使用外部连接,但不知道如何使用。 在本例中,我将只使用3个表,因为我认为如果您帮助我开始,我可以设法修复其余的表 我的表格列表: 表1=dbo.kala(这是我添加的第7个表 表2=dbo.ti 表3=dbo.ao SELECT kala.kaldat From dbo.kala

我正在尝试将内部联接和外部联接结合起来,但无法使其工作。我总共有7个表需要在一个查询中连接在一起。 首先,我只有6个,没有任何问题,因为一切都是内部连接。但现在我已经添加了第七个表,无法正确获得它。我想我需要以某种方式使用外部连接,但不知道如何使用。 在本例中,我将只使用3个表,因为我认为如果您帮助我开始,我可以设法修复其余的表

我的表格列表:

表1=dbo.kala(这是我添加的第7个表

表2=dbo.ti

表3=dbo.ao

SELECT kala.kaldat
From dbo.kala
Where kala.kaldat Between '170407' AND '170410'
上面的查询返回以下结果

Result1
|kaldat    |
|2017-04-07|
|2017-04-08|
|2017-04-09|
|2017-04-10|

上面的查询返回以下结果

Result2
ti.startdat| ti.artnr| ti.aonr|ti.aopos|ao.prodgr|
2017-04-07 | 123     | 0001   |10      |50       |
2017-04-10 | 456     | 0002   |20      |60       |
我想要的结果是(3)

dbo.kala和dbo.ti之间的连接在kala.kaldat=ti.startdat上

希望你们能理解我在这里要表达的意思。如果不是,我会事先道歉,并很乐意尝试更好地解释。提前谢谢


*注意,本例中未包含的其余4个表需要与dbo.ti连接(内部?)。

ti.aonr=ao.aonr和ti.aopos=ao.aopos上的内部连接dbo.ao

您想要实现的目标需要使用


在ti.aonr=ao.aonr和ti.aopos=ao.aopos上左连接dbo.ao
kala
选择日期,然后外部连接
ti
,然后外部连接
ao

SELECT kala.kaldat, ti.artnr, ti.aonr, ti.aopos, ao.prodgr
FROM dbo.kala
LEFT JOIN dbo.ti ON kala.kaldat = ti.startdat
LEFT JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos
WHERE kala.kaldat BETWEEN '20170407' AND '20170410';

(您也必须进行外部联接
ao
,因为如果
ti
记录是外部联接的,则其
aonr
aopos
为空。如果您进行内部联接
ao
,则不会得到匹配项,从而从结果中丢弃该行。)

左连接是您所追求的,但如果您有任何where子句条件,涉及“左”的“右”表join,然后它需要放在join上,或者您的left join模拟一个内部join。您正在尝试选择在3个表中的一个表中没有索引的数据,因此您需要使用left join或full outer join,具体取决于您想要获得的内容--->请看,我确实有更多连接到dbo.ti的where子句…我需要从dbo.ka获得的所有内容la是日期列表。然后我希望其他表格只填写正确日期的信息。谢谢,但您没有使用表“kala”你可以自己添加这些表,在查询中添加另一个连接。只需添加另一个连接:
LEFT JOIN table 2 t2 ON t1.id=t2.id LEFT JOIN table 3 t3 ON t1.id=t3.id
依此类推。太棒了!谢谢。
Result3
kala.kaldat| ti.artnr| ti.aonr|ti.aopos|ao.prodgr|
2017-04-07 | 123     | 0001   |10      |50       |
2017-04-08 |         |        |        |         |
2017-04-09 |         |        |        |         |
2017-04-10 | 456     | 0002   |20      |60       |
SELECT kala.kaldat, ti.artnr, ti.aonr, ti.aopos, ao.prodgr
FROM dbo.kala
LEFT JOIN dbo.ti ON kala.kaldat = ti.startdat
LEFT JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos
WHERE kala.kaldat BETWEEN '20170407' AND '20170410';