用内部和外部连接几个表。
joining several tables with inner and outer.
我正在尝试结合内连接和外连接,但无法正常工作。我总共有 7 个 table 需要在一个查询中连接在一起。
首先,我只有 6 个并且没有问题,因为一切都是内部连接。但是现在我已经添加了第七个 table 并且不能正确。我想我需要以某种方式使用 OUTER JOIN 但不知道如何。
在此示例中,我将只使用 3 tables,因为我认为如果您帮助我开始,我可以设法修复其余部分。
我的 table 名单:
表1=dbo.kala(这是我添加的第7个table。
表 2=dbo.ti
表 3=dbo.ao
SELECT kala.kaldat
From dbo.kala
Where kala.kaldat Between '170407' AND '170410'
以上查询returns结果如下。
Result1
|kaldat |
|2017-04-07|
|2017-04-08|
|2017-04-09|
|2017-04-10|
.
SELECT ti.startdat, ti.artnr, ti.aonr, ti.aopos, ao.prodgr
From dbo.ti
INNER JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos
Where ti.startdat Between '170407' AND '170410'
以上查询returns结果如下。
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)。
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 |
dbo.kala 和 dbo.ti 之间的连接在 kala.kaldat = ti.startdat 上。
希望你们明白我在这里想要表达的意思。如果没有,我会事先道歉,并很乐意尝试更好地解释。提前致谢!
*请注意,此示例中没有的其余 4 个 table 需要与 dbo.ti 连接(INNER?)。
INNER JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos
您要实现的目标需要使用
LEFT JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos
Select 从 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
是空的。如果你inner joined ao
,你将得不到匹配项,因此会从结果中丢弃该行。)
我正在尝试结合内连接和外连接,但无法正常工作。我总共有 7 个 table 需要在一个查询中连接在一起。 首先,我只有 6 个并且没有问题,因为一切都是内部连接。但是现在我已经添加了第七个 table 并且不能正确。我想我需要以某种方式使用 OUTER JOIN 但不知道如何。 在此示例中,我将只使用 3 tables,因为我认为如果您帮助我开始,我可以设法修复其余部分。
我的 table 名单:
表1=dbo.kala(这是我添加的第7个table。
表 2=dbo.ti
表 3=dbo.ao
SELECT kala.kaldat
From dbo.kala
Where kala.kaldat Between '170407' AND '170410'
以上查询returns结果如下。
Result1
|kaldat |
|2017-04-07|
|2017-04-08|
|2017-04-09|
|2017-04-10|
.
SELECT ti.startdat, ti.artnr, ti.aonr, ti.aopos, ao.prodgr
From dbo.ti
INNER JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos
Where ti.startdat Between '170407' AND '170410'
以上查询returns结果如下。
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)。
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 |
dbo.kala 和 dbo.ti 之间的连接在 kala.kaldat = ti.startdat 上。
希望你们明白我在这里想要表达的意思。如果没有,我会事先道歉,并很乐意尝试更好地解释。提前致谢!
*请注意,此示例中没有的其余 4 个 table 需要与 dbo.ti 连接(INNER?)。
INNER JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos
您要实现的目标需要使用
LEFT JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos
Select 从 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
是空的。如果你inner joined ao
,你将得不到匹配项,因此会从结果中丢弃该行。)