加入多个表格,其中至少满足1个条件

时间:2016-08-25 01:27:37

标签: sql join sas

假设我的销售主表'Z'包含Item_ID,Organisation_ID,Salesman_ID,Area_ID

我需要列出表A中的销售人员之一或表B中的组织销售的项目,或表C中的区域中销售的项目。区域,组织和销售人员彼此独立。

我能够在WHERE子句中使用SUBSELECT创建一个查询:

Select Z.Item_ID From Z WHERE
Z.Salesman_ID IN (SELECT Salesman_ID From A) OR
Z.Organisation_ID IN (SELECT Organisation_ID From B) OR
Z.Area_ID IN (SELECT Area_ID From C)

然而,性能是一个问题,我被告知连接比Subselects更快。我无法用一种能够获得“OR”结果的方式来组合连接......

旁注:在发布之前,我已经阅读了sql连接的视觉解释,并尝试通过Google找到我的问题的答案(根据非常常见的关键字找到正确的答案很棘手)。

样品

A     | B     | C
S04   | O16   | A07
S12   | O01   | A08
S14   |       | 
S15   |       | 

Z表:

I01 S09 O12 A14
I02 S17 O20 A17
I03 S18 O20 A12
I04 S07 O15 A01
I05 S14 O03 A08
I06 S16 O18 A20
I07 S05 O03 A12
I08 S11 O14 A05
I09 S15 O19 A10
I10 S13 O07 A18
I11 S15 O08 A03
I12 S15 O14 A13
I13 S08 O16 A18
I14 S16 O19 A14
I15 S13 O18 A10
I16 S03 O12 A08
I17 S11 O09 A16
I18 S14 O17 A13
I19 S02 O13 A11
I20 S18 O10 A06
I21 S10 O05 A15
I22 S19 O20 A06
I23 S15 O16 A20
I24 S02 O07 A04

预期结果:

I05
I09
I11
I12
I13
I16
I18
I23

1 个答案:

答案 0 :(得分:0)

与大多数与性能相关的问题一样,它取决于您的表架构,索引,数据等。据说,existsouter joins通常可以更有效:

应该是您所指的等效join方法:

select z.item_id
from z
   left join a on z.salesman_id = a.salesman_id
   left join b on z.organisation_id = b.organisation_id
   left join c on z.area_id = c.area_id
where a.salesman_id is not null or
   b.organisation_id is not null or
   c.area_id is not null 

根据您的数据,您可能还需要使用distinct

修改:使用您的示例数据,如果您的Id字段对于每个实体都是唯一的,那么使用existsunion all的此解决方案可能是效率最高的(z.salesman_id, z.organisation_id, z.area_id)select item_id from z where exists ( select 1 from ( select salesman_id id from a union all select organisation_id from b union all select area_id from c ) t where t.id in (z.salesman_id, z.organisation_id, z.area_id) ) 1}}:

{{1}}