2017-06-15 54 views
1

我有我的数据库中的三个表,让我们称他们为: 1. VALUE_TYPE 2.值 3.机构单位哪些错误与此MySQL查询 - 左外连接

每个值有一个外键引用一个value_type和一个组织。此外,每个值类型也有一个默认值。

我正在尝试为所有组织执行左外部联接,以便如果值表中存在记录,它将返回该记录中的值,并且如果该记录不存在,则将采用默认值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

好吧...如果vals.org_ID不存在o.id,那么所有vals.records都将为null,因此您的case语句将始终为这样的记录返回Null值。换句话说,因为组织中没有val的记录,所以不能以这种方式得到默认值。 – xQbert

+0

value_type和orgs如何关联?我们如何知道为组织选择了什么样的价值类型,或者为什么你只限于'xyz'的vt.name?这只会导致1条记录? – xQbert

+2

通常如果你想要一个默认值,它不是基于外键关系,它是一个特殊的行,被认为是默认值,而不是与该值相同行中的另一列。您可以通过单独的连接来获得该行的ID。你能展示一些样本数据和预期结果吗? – Barmar

回答

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当有orgsvalue之间不匹配的记录。您在value_typesorgs之间没有连接。它必须经过value,所以需要orgsvalue之间的匹配。

+0

如果组织中没有值的记录,那么如何从值类型获得默认值,因为连接是从O - > V - > VT? – xQbert

1

似乎很奇怪,但也许你需要交叉连接org value_Type然后左连接价值?

这种从组织记录的方式将列出给定名称的所有值类型;随着默认值,然后如果一个记录存在的价值,我们也特别加入。然后coalesce将选择vals.choice之间的第一个非空值(如果存在)并交叉加入我们知道存在的vt.default_value。

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 
+0

是的,我确实需要一个交叉连接,并为我做了。 – RajveerParikh