我有三张牌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);
不确定如何获得我想要的结果。如果有帮助,我愿意改变我的桌子。
答案 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 join
和right join
,除非目的是说明一些奇怪的行为。Left join
很有意义。 。 。将所有行保留在第一个表中,即使子序列表中没有匹配项。where
,group by
,order 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的。