这个MySQL查询有什么问题 - 左外连接

时间:2017-06-15 19:45:13

标签: mysql sql join left-join outer-join

我的数据库中有三个表,我们可以调用它们: 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

2 个答案:

答案 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' ;

但是,如果NULLorgs之间没有匹配的记录,则仍会返回value。您在value_typesorgs之间没有联系。它必须经过value,因此需要orgsvalue之间的匹配。