2017-03-02 54 views
1

我有一個包含role_id行的帳戶表。我有另一個稱爲組織組的組織,它擁有與組織相關聯的組織,這個組織擁有一個ID和一個名稱列。我有第三個名爲account_group的表,它有兩列,一個是account_id和一個group_id,可以將兩者一起映射。JOIN子查詢中SQL更新拋出錯誤

現在我想檢查該帳戶的組,並根據組的名稱我將更新此帳戶的角色id值。

我設法想查詢:

UPDATE account 
SET account.role_id = (CASE WHEN organisation_group.name = "Social Worker" THEN 50 
          WHEN organisation_group.name = "Foster Carer" THEN 26 
         END) 
    WHERE organisation_group.name in 
    (SELECT organisation_group.name FROM organisation_group 
INNER JOIN account_group ON organisation_group.id = account_group.group_id 
WHERE organisation_id = 11 GROUP BY organisation_group.name); 

這是拋出下面的錯誤Unknown column 'organisation_group.name' in 'IN/ALL/ANY subquery'。我不擅長SQL,但我需要這個更新。任何想法如何做這個操作。

50和26是我想要使用的角色ID。

更新1(更清晰的闡釋)

我有列[ID,用戶名,名,ROLE_ID,organisation_id]帳戶表。

我需要編輯account.role_id列。我需要做的是:

  1. 檢查帳戶的組名稱。

這些組位於名爲organisation_group的表中。此表格有三列[id,organisation_id,name]。

要映射帳戶與組我有一個名爲account_group有三個列[id。 account_id,group_id]。

2-根據組名稱,我需要更新account.role_id以在(組名=角色名稱)時具有角色ID。

該角色存儲在名爲organisation_role的表中,該表具有列[id,name,organisation_id]。

+0

您無法訪問子查詢外部的'organisation_group'表。 –

+1

一些示例數據或更好的描述你想要做的事情會有所幫助。 –

+1

您的查詢沒有結果。你正在用'organisation_group.name'對子查詢進行分組。因此你失去了與'賬戶'表的關係。 –

回答

1

首先在你的,你指的是一個TABLE.COLUMN WHERE organisation_group.name不可見的頂級 條件庫侖是你需要account.name 其次,一個建議,你有沒有聚集功能我子查詢,所以如果你需要不同的價值起訴不同的條款

UPDATE account 
SET account.role_id = (CASE WHEN organisation_group.name = "Social Worker" THEN 50 
          WHEN organisation_group.name = "Foster Carer" THEN 26 
         END) 
WHERE account.name in 
    (SELECT distinct organisation_group.name FROM organisation_group 
     INNER JOIN account_group ON organisation_group.id = account_group.group_id 
     WHERE organisation_id = 11 
    ); 

但 如果我的理解對不對您的加入規則,你應該加入這樣

UPDATE account 
INNER JOIN account_group on account_group.account_id = account.id 
INNER JOIN organisation_group on organisation_group.id = account_group.group_id 
SET account.role_id = (CASE WHEN organisation_group.name = "Social Worker" THEN 50 
         WHEN organisation_group.name = "Foster Carer" THEN 26 
        END) 
WHERE organisation_group.id = 11 
+0

您附加的腳本仍會拋出相同的錯誤,因爲如您所說,我們無法從子查詢外部訪問organisation_group.name。不知道如何解決這個..任何想法? .. 謝謝! –

+0

你需要什麼條件..? 。哪一列帳戶表必須涉及?如何 .. ?嘗試解釋我,所以我可以評估.. – scaisEdge

+0

我已更新asnwer添加一個加入更新...希望是你需要的..或至少引導你在正確的道路.. – scaisEdge

0

這裏的我使用的技術。我沒有開始嘗試編寫多表UPDATE語句,而是通過編寫SELECT語句來啓動進程。

SELECT語句的目標是返回我想要更新的行(至少是該行的主鍵/唯一鍵/標識符)以及要更新的列(將要更新的列除此之外,我還返回了我想要分配列的新值。

我可以調整和使用該SELECT語句來讓它返回我想要的行。我可以驗證將要分配的新值。而且我可以做所有這些,而不會浪費數據庫,更新錯誤的行。

一旦我驗證了SELECT語句,通常可以直接將它轉換爲UPDATE語句。 (在某些情況下,我將不得不採取的SELECT語句,並在括號包裹,並用它作爲內聯視圖。)


我們可以,我們要更新的表開始。

SELECT a.id 
    , a.group_name 
    , a.role_id 
    FROM account a 
ORDER BY a.id 

添加一個連接到account_group

SELECT a.id 
    , a.group_name 
    , a.role_id 
    , g.group_id 
    FROM account a 
    JOIN account_group g 
    ON g.account_id = a.id 
ORDER BY a.id 

(是不是仍然返回所有我們要回來嗎?或多行嗎?如果我們得到的多行匹配的行中,然後行我們究竟要匹配......是基數吧?)

然後添加加盟organisation_group

SELECT a.id 
    , a.group_name 
    , a.role_id 
    , g.group_id 
    , o.name 
    FROM account a 
    JOIN account_group g 
    ON g.account_id = a.id 
    JOIN organisation_group o 
    ON o.id = g.group_id 
ORDER BY a.id 

是否返回正確的行?然後我們可以添加表達式來將role_id派生到SELECT列表中。

SELECT a.id 
    , a.group_name 
    , a.role_id 
    , g.group_id 
    , o.name 

    , CASE o.name 
     WHEN 'Social Worker' THEN 50 
     WHEN 'Foster Care' THEN 26 
     ELSE NULL 
     END AS new_role_id 

    FROM account a 
    JOIN account_group g 
    ON g.account_id = a.id 
    JOIN organisation_group o 
    ON o.id = g.group_id 
ORDER BY a.id 

是否存在的group_name不匹配group_name任何NULL值,或者價值觀? new_role_id列是否包含我們要分配的值,對每一行都是正確的?是否有任何我們不想更新的行被返回?我們是否想爲「社會工作者」和「寄養」之外的名稱設置role_id爲NULL,還是我們希望保持原樣? (通過用a.role_id替換NULL)?

一旦我們有一個SELECT語句工作,將其轉換爲UPDATE。

我們只是UPDATE關鍵字替換SELECT ... FROMWHERE子句前添加一個SET條款(或在此情況下,ORDER BY子句之前。)

在這個例子中,我們可以指定new_role_id表達了role_id柱。

UPDATE account a 
    JOIN account_group g 
    ON g.account_id = a.id 
    JOIN organisation_group o 
    ON o.id = g.group_id 
    SET a.role_id 
    = CASE o.name 
     WHEN 'Social Worker' THEN 50 
     WHEN 'Foster Care' THEN 26 
     ELSE NULL 
     END 
ORDER BY a.id 

這是我用來構建多表更新語句的方法。我不夠聰明,開始編寫UPDATE語句。我使用逐步細化來構建SELECT語句,因爲我想確保我知道語句將要執行的操作。通過檢查從SELECT返回的結果,我可以進行驗證。在我使用UPDATE創建表之前。