带有3个连接表的SQL select语句

时间:2018-04-23 18:06:28

标签: sql join

我有三张牌blocksequences blocksequenceparts partpositions 这里有一些例子:

blocksequenceid P1 P2 P3 P4
E006-T001-S054-S036 E006 T001 S054 S036

blocksequenceid partid
E006-T001-S054-S036 E006
E006-T001-S054-S036 T001
E006-T001-S054-S036 S054
E006-T001-S054-S036 S036

partpositions
E006 P1
T001 P2
S054 P3
S054 P4
S036 P3
S036 P4

你可以看到S054和S036可以在P3或P4的位置(在不同的blocksequence中可以看到)

我想创建此表:

blocksequenceid partid positionid
E006-T001-S054-S036 E006 P1
E006-T001-S054-S036 T001 P2
E006-T001-S054-S036 S054 P3
E006-T001-S054-S036 S036 P4

但我得到了

blocksequenceid partid positionid
E006-T001-S054-S036 E006 P1
E006-T001-S054-S036 T001 P2
E006-T001-S054-S036 S054 P3
E006-T001-S054-S036 S054 P4
E006-T001-S054-S036 S036 P3
E006-T001-S054-S036 S036 P4

因此,对于这个特定的阻塞序列,S054位于P3位置,S036仅位于P4位置,但无论阻塞序列如何,我都获得了这些部分的所有可能位置。

这是我一直在使用的陈述:

create table test as( 
select blocksequenceparts.blocksequenceid, blocksequenceparts.partid, partpositions.positionid
from blocksequences right outer join blocksequenceparts on blocksequences.blocksequenceid=blocksequenceparts.blocksequenceid  left outer join partpositions on blocksequenceparts.partid=partpositions.partid
order by blocksequenceid);

不确定如何获得我想要的结果。如果有帮助,我愿意改变我的桌子。

1 个答案:

答案 0 :(得分:1)

你怎么决定哪个部分在哪个位置?您提供的数据会产生六行。真正的解决方案是partpositions每个部分只有一行,或者blocksequenceparts包含位置和部分。

此查询不能解决您的问题,但它至少可以简化查询:

select bs.blocksequenceid, bsp.partid, pp.positionid
from blocksequences bs left outer join
     blocksequenceparts bsp
     on bs.blocksequenceid = bsp.blocksequenceid  left outer join
     partpositions pp
     on bsp.partid = pp.partid
order by bs.blocksequenceid;

首先,请注意在使用表别名时,查询写入和读取的容易程度。

其次,外连接的规则。

  • 你几乎总是想要left join。事实上,我几乎从不使用right join。我从不混合left joinright join,除非目的是说明一些奇怪的行为。
  • Left join很有意义。 。 。将所有行保留在第一个表中,即使子序列表中没有匹配项。
  • 条款(wheregroup byorder by)通常应该使用第一个表格中的列。

通过使用聚合,每个序列/部分位置可以获得一行:

select bs.blocksequenceid, max(bsp.partid), pp.positionid
from blocksequences bs left outer join
     blocksequenceparts bsp
     on bs.blocksequenceid = bsp.blocksequenceid  left outer join
     partpositions pp
     on bsp.partid = pp.partid
group by bs.blocksequenceid, pp.positionid
order by bs.blocksequenceid;

这使您无法控制选择 partid的