2012-07-11 87 views
-1

我有一個表,我需要更新到Y的值,但此更新是基於其他表的一些結果,我不知道如何做到這一點。SQL Server更新與複雜的邏輯

基本上,我需要完成下列檢查

  1. 我需要從我需要更新該表以檢查其他表具有正好19匹配的行
  2. 在這些匹配的行的一個字段不爲空
  3. 我有兩個其他表,我需要檢查後面的表中存在的記錄,以確保後者中的匹配記錄在其中一個字段中不包含「Y」的值。

我的這種方法是使用工會,但我想一個人幫我,這種做法是否正確,或者是否有這樣做的更好的方法:我認爲

SELECT '1' 
FROM t_A_Outbound 
Where NOT HEADER IN (Select HEADER FROM t_B_Outbound) 

UNION 

SELECT '1' 
FROM t_A_Outbound 
Where HEADER IN (Select HEADER FROM t_B_Outbound 
       WHERE NOT INCOMPLETE ='Y') 

UNION 

Select '1' 
From t_C_Outbound 
Where ValueString = '' 

UNION 

Select '1' 
From t_C_Outbound 
WHERE Exists(Select Count(key), HEADER 
      From t_C_Outbound IN (SELECT HEADER FROM table_that_needs_updating) 
      Group By HEADER 
      Having NOT Count(Cast(key as Int)) = 19) 

用1作爲標誌來說明這個值是否回來更新我需要改變的表中的字段。

任何人都可以告訴我嗎?

+0

你能告訴我們你想要的'update'語句嗎?我在想,你可以使用'from'和'where'子句來做你需要的一切來驗證數據。 – HABO 2012-07-11 18:50:54

+0

我沒有寫出實際的更新聲明,但我正在查看我正在做的方法是否正確。所以,這是我正在尋找的建議 – Andy5 2012-07-11 19:01:18

+0

您正在製作相當多的包含數字「1」的字符串。我不確定這有什麼幫助。因爲如果所有的驗證都成功了,你就無法傳達你要更新的內容,除了建議使用'join'中的'if'或'update'外,我不能做更多的事情。 – HABO 2012-07-11 19:16:33

回答

0

對於我來說,這對我來說還不是很清楚。

您想更新語句是這樣的:

update table 
    set y = . . . 
    where header in (Select header 
        From t_C_Outbound 
        Group By HEADER 
        Having Count(*)= 19 and 
          count(KEY) = count(*) 
        ) and 
      header in (select header 
        from other table 
        group by header 
        having sum(case when col = 'Y' then 1 else 0 end) = 0 
        ) 

等。您沒有足夠清楚地描述問題以提供更詳細的代碼。