2017-06-15 85 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