2014-03-12 65 views
0

如何編寫以下算法作爲SQL查詢(abc是在我的數據庫表)如何寫一個循環作爲一個SQL查詢有效

for all a: 
case c.column=0 
set a.columnname+=b.column1*b.column2 
case c.column=1 
... 

earlier i solved a similar problem by:       
UPDATE a 
set 
a.column= (select SUM(column1) from b where a.column2=b.column2) 

但由於中總結一兩列的產品我不認爲我可以做同樣的事情。 另外真正的問題在於一個與m與m有關係的人。

關係:

一對多b。

B中的一個,以一種C

可以說A是公司的數據表,B是員工的數據表和C告訴我們,如果一個員工是男性還是女性(只是舉個例子不是真的我的問題) 。現在我需要計算給每個公司的每個員工的總工資,並將其存儲在公司的表中的一個字段中。小我說根據員工性別計算這個不同。現在又有數百家公司,每家公司都有數千名員工。

+0

你可以看看遊標,但用錯了,他們吮吸。爲什麼你需要在sql循環?過去我曾經想過很多次,並且通常用一行選擇或更新語句顯示出來。 – mmeasor

+0

你的表格是如何相互關聯的?剩下的邏輯是什麼?有一些統一性嗎? –

+0

您的表格是否相互關聯?你可以說明你想用簡單的英文而不是僞代碼來做什麼嗎? – Andrew

回答

0

要減少使用GROUP BY一組和彙總功能,如SUM。 對於A中的每條記錄,您想獲得B和C中所有相關記錄上某些函數的總和。

首先我們將製作一個SELECT聲明以確保我們獲得正確的數據。這將是這個樣子:

SELECT 
    a.id, 
    SUM(CASE WHEN c.[column]=0 THEN b.column1 * b.column2 ELSE 0 END) + 
    SUM(CASE WHEN c.[column]=1 THEN b.column1 + b.column2 ELSE 0 END) AS new_value 
FROM a 
INNER JOIN b ON a.id = b.a_id 
INNER JOIN c ON b.id = c.b_id 
GROUP BY a.id --and all other columns from A that you select/update, making sure it contains at least the columns required to select a unique record from a. 

將其轉換爲一個更新語句,你可以做一個1:1加入到常規表答:

UPDATE updated_a 
    SET columnname = new_value 
    FROM a AS updated_a INNER JOIN 
    (SELECT 
    a.id, 
    SUM(CASE WHEN c.[column]=0 THEN b.column1 * b.column2 ELSE 0 END) + 
    SUM(CASE WHEN c.[column]=1 THEN b.column1 + b.column2 ELSE 0 END) AS new_value 
FROM a 
INNER JOIN b ON a.id = b.a_id 
INNER JOIN c ON b.id = c.b_id 
GROUP BY a.id) AS calculation ON updated_a.id = calculation.id; 

http://sqlfiddle.com/#!6/2dffa/14

1
你可能希望把它分解成從case語句爲不同系列的「案件」的查詢

WHERE子句:

UPDATE <thing> 
SET ....... 
FROM a,b c 
INNER JOIN ....... 
WHERE c.column=0; 


UPDATE <thing> 
SET ....... 
FROM a,b c 
INNER JOIN ....... 
WHERE c.column=1; 

看到這些語法類型的實例:

+0

由於a和b之間存在一對多關係,因此聯接會填充太多行。 – user2197558

+0

hm,那麼您可能還想創建一些臨時表以更新值,以避免一對多問題。我認爲Rinze Smits在另一個答案中有一個解決方案,其中這些都在一個查詢中。 – Angst

1

如果你在每一種情況下更新columnname那麼你並不需要一個循環:

UPDATE a 
SET columnname = 
    CASE WHEN c.column=0 
     THEN columnname + b.column1*b.column2 
    CASE WHEN c.column=1 
     THEN ... 

,否則這將是與不同的多個更新,對採用基於您的更新條款

和清潔評論這樣的事情可能工作:

UPDATE a 
set a.column = 
(SELECT 
SUM(
    CASE WHEN c.EmployeeGender = 0 
      THEN b.column1*b.column2 
      WHEN c.EmployeeGender = 1 
      THEN ... 
      ELSE 
    END 
    ) 
FROM b 
INNER JOIN c 
    ON b.EmployeeID = c.EmployeeID 
WHERE a.column2=b.column2) 
+0

由於a和b之間的一對多關係,我實際上試圖解決使用聯接問題。它會填充太多的行。 – user2197558

+0

如果你不能加入他們,你還怎麼把'a'與'b'聯繫起來? –

+0

我更新了,以顯示我如何做一個早期的例子 – user2197558