首先,我使用的是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:抱歉我的英语不好......尽力做到最好。
答案 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语句) )