我有四张桌子 - A、B、C 和 D。
表 A 保存库存移动记录,表 B 保存每个项目的销售记录,表 C 保存每个项目的非销售记录,表 C 保存非销售移动的类型。
对于 A 中的每条记录,B 中都有一行或 C 中的一行。因此,为了获得每个项目的单行动作,我执行以下操作:
select column1, column2, ... from A
left join B on B.Id = A.IdIntoB
left join C on C.Id = A.IdIntoC
到目前为止,一切都很好。但是,因为我需要知道它在 C 中的运动类型,所以我想返回以下内容:
ItemId, Date, Sales, Goods In, Returns to Supplier
即,有单独的栏目来表示收货和退回给供应商的货物。
类型(货物进入或返回供应商)存储在 D 中,并且 C 和 D 之间存在多对一关系,因为 D 是对 C 中的项目进行分组的“文档”。
如果我做:
select column1, column2, ... from A
left join B on B.Id = A.IdIntoB
left join C as C1 on C1.Id = A.IdIntoC
left join D on D.Id = C1.IdIntoD and D.Type = 1
left join C as C2 on C2.Id = A.IdIntoC
left join D on D.Id = C2.IdIntoD and D.Type = 2
我只是得到重复的行,因为从 A 到 C 的两个连接实际上是相同的。
我想做的是这个(非法律语法):
select column1, column2, ... from A
left join B on B.Id = A.IdIntoB
left join C as C1 on C1.Id = A.IdIntoC and D.Type = 1
left join D on D.Id = C1.IdIntoD
left join C as C2 on C2.Id = A.IdIntoC and D.Type = 2
left join D on D.Id = C2.IdIntoD
基本上我想根据 D 中的值分离 A 和 C 之间的连接。我知道left join
每次都必须在 C 和 D 之间使用 a ,否则我将得不到任何数据,但从逻辑上讲,这就是我觉得我需要做的.
我该怎么做呢?
我认为您不需要加入
C
表格两次。这会起作用:(D.Type = 1 OR D.Type = 2)
可以进一步简化D.Type in (1, 2)
为。如果您确实想要 2 个连接到
C
(andD
),您可以将倒数第二个查询中的语法更改为 (do aninner
join toD
) 并将连接条件移到末尾:或更简单,加入
C
一次和D
两次: