完全加入或2左加入

时间:2016-03-24 16:57:56

标签: sql postgresql join

首先,我使用的是PostgreSQL 9.1.20。

我有4个表(dp,dpo,ds,dso),其中包含这些依赖项:

ds.dp_id=dp.id
dpo.dp_id=dp.id
dso.ds_id=ds.id

换句话说:

dp have multiples ds entries (1,n);
dp can have multiples dpo entries or none (0,n);
ds can have multiples dso entries or none (0,n);

dso和dpo包含一个公共字段(option),有时dso.option = dpo.option dso和dpo包含另一个公共字段(value),但dso.value比dpo.value更相关。

如果相同"选项"存在于" dpo"表和" dso"表,然后"值" dso更相关。 如果"选项"只存在于" dpo",然后我们接受它。 如果"选项"只存在于" dso",然后我们接受它。

我已经尝试过了:

SELECT * 
FROM dp,ds,dso 
   FULL JOIN dpo USING (option) 
WHERE ds.id=1 
  AND dso.ds_id=ds.id 
  AND dpo.dp_id=dp.id;

似乎没有用,因为dso和dpo可以为空。

SELECT * 
FROM dp,ds,dso 
  FULL JOIN dpo USING (option) 
WHERE ds.id=1 
AND (dso.ds_id=ds.id OR dso IS NULL) 
AND (dpo.dp_id=dp.id OR dpo IS NULL);

也不行。

此外,也许我应该使用LEFT JOIN作为" dso"到" ds"和" dpo"到" dp"依赖关系...

SELECT * 
FROM (dp LEFT JOIN dpo ON dpo.dp_id=dp.id) 
   FULL JOIN (ds LEFT JOIN dso ON dso.ds_id=ds.id) ON (dso.option=dpo.option).

编辑: 为了更好地查看问题,有一个在线图表:http://hpics.li/3a934a3

PS:抱歉我的英语不好......尽力做到最好。

1 个答案:

答案 0 :(得分:1)

这是一个开始:

select * from ds
join dp on dp.id=ds.dp_id
left join dpo on dop.dp_id=dp.id
left join dso on dso.ds_id=ds.id

您的问题“dso和dpo包含一个公共字段(选项),有时dso.option = dpo.option dso和dpo包含另一个公共字段(值),但dso.value比dpo.value更相关。”

对我没有意义。基于这个问题,我们无法确定每个dp是否存在多个DPO和DSO记录,并且如果每个“选项”或“值”存在多个记录,则会非常混乱。

我无法从你的问题中判断出这部分是否试图限制行(IE在where或join子句中添加了某些内容),或者它是否正在尝试解释数据(使用case中的if或if语句) )