2017-04-13 79 views
1

我想结合内部和外部连接,但无法让它工作。我一共有7个表需要在一个查询中连接在一起。 首先,我只有6人,并没有问题,因为一切都是内部联接。但是现在我已经添加了第七张桌子,并且无法正确完成。我想我需要使用OUTER JOIN,但不知道如何。 我只会在这个例子中使用3个表格,因为我认为如果你能帮助我开始,我可以设法解决其余问题。加入几个表与内部和外部。

列表我的表:

表1 = dbo.kala(这是第七表我加入

表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| 

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' 

上述查询返回以下结果。

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个不在此示例中的表需要与dbo.ti连接(INNER?)。

+0

左连接是你所追求的,但是如果你有任何where子句条件涉及到“左”连接的“右”表上的表,那么它需要放在连接上或者你的左连接模拟一个内连接。 – xQbert

+0

您正尝试选择3个表中没有索引的数据,因为您需要使用左连接或完全外连接,具体取决于您想要获取的内容--->请参见https://i.stack。 imgur.com/66zgg.png –

+0

我确实有更多的地方连接到dbo.ti的子句...我需要的所有从dbo.kala是日期列表。然后我希望剩下的表格只填写正确日期的信息。 – SisU

回答

1

选择日期从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记录外连,那么它的aonraopos为空。如果你加入内ao,你会得到不匹配,因此丢弃)

+0

太棒了!谢谢。 – SisU

2

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

+0

谢谢,但你还没有使用表“卡拉”呢? – SisU

+0

那么,您可以自己添加这些表格,以便为查询添加另一个JOIN。您只需添加另一个连接: 'LEFT JOIN table2 t2 ON t1.id = t2.id LEFT JOIN table3 t3 ON t1.id = t3.id' 等等等等。 – schroedingersKat