我的数据库中有三个表,我们可以调用它们: 1. value_type 价值观 3.组织
每个值都有一个对value_type和org的外键引用。此外,每种值类型也都有一个默认值。
我正在尝试为所有组织执行左外连接,这样如果值表中存在记录,它将返回该记录中的值,如果记录不存在,它将采用默认值value_type表。但是,当我运行以下查询时,它会为值表中尚不存在记录的所有组织返回空值。
SELECT
o.id as org_id,
o.name as org_name,
case when vals.choice is null then vals.default_value else vals.choice END as select_choice,
vals.choices as choices
FROM orgs o
LEFT OUTER JOIN
(SELECT
v.id as id,
v.choice as choice,
v.org_id as org_id,
v.name as val_name,
vt.default_value as default_value,
vt.choices as choices
FROM value v
INNER JOIN value_type vt ON v.value_type = vt.id
WHERE vt.name = 'xyz') vals
ON vals.org_id = o.id
答案 0 :(得分:1)
看起来很奇怪但是你可能需要将orgs交叉连接到value_Type然后将join连接到值?
这种方式来自org的记录将列出给定名称的所有值类型;除了默认值,然后如果记录存在于值中,我们也特别加入它。然后coalesce将在vals.choice(如果存在)和我们知道的交叉连接vt.default_value之间选择第一个非null值。
SELECT
o.id as org_id,
o.name as org_name,
coalesce(vals.choice, VT.Default_Value)
VT.choices as choices
FROM orgs o
CROSS JOIN (SELECT id, choices, default_value FROM Value_Type where Name = 'xyz') VT
LEFT OUTER JOIN
(SELECT
v.id as id,
v.choice as choice,
v.org_id as org_id,
v.name as val_name,
v.value_Type
FROM value v) vals
ON vals.org_id = o.id
AND vals.value_type = vt.id
答案 1 :(得分:0)
我希望这样的事情:
SELECT o.id as org_id,o.name as org_name,
COALESCE(v.choice, vt.default_value) as select_choice,
vt.choices as choices
FROM orgs o LEFT JOIN
value v
ON v.org_id = o.id LEFT JOIN
value_types vt
ON vt.id = v.value_type AND vt.name = 'xyz' ;
但是,如果NULL
和orgs
之间没有匹配的记录,则仍会返回value
。您在value_types
和orgs
之间没有联系。它必须经过value
,因此需要orgs
和value
之间的匹配。