2013-02-14 90 views
1

對於以下查詢:有沒有辦法在UPDATE查詢中包含不可更新的查詢?

UPDATE tempSpring_ASN AS t 
SET t.RECORD_TYPE = (
     SELECT TOP 1 RECORD_TYPE 
     FROM (
      SELECT "A" AS RECORD_TYPE 
      FROM TABLE5 
      UNION ALL 
      SELECT "B" AS RECORD_TYPE 
      FROM TABLE5 
      ) 
     ); 

我得到,「操作必須使用一個可更新的查詢。」我不明白。我不想更新聯合查詢。我只是試圖用聯合查詢的輸出(單值)來更新另外可更新的記錄集。

(將在Access SQL Update One Table In Join Based on Value in Same Table(這也是下面提供)提供的解決方案並不針對這種情況,相反的是在本頁面的上方顯示的工作。)

+0

@invertedSpear,這不是一個可能的重複。我自己引用它。我這樣做是爲了讓人們更容易遵循。 :-) – as9876 2013-02-15 01:54:37

+0

它被標記爲這樣,因爲它不是堆棧溢出的意圖,因爲它是與前面的問題反向鏈接的論壇。如果你的問題不同,那是一回事,但如果你只是提供額外的細節或澄清,就像你在這裏做的那樣,你應該對原始問題進行編輯。關鍵在於網絡搜索應該提出一個問題,而不是一個需要跟隨其他問題的鏈接才能找出問題的問題。 SO不僅僅是在幫助你,它應該很容易幫助任何在將來有類似問題的人。 – invertedSpear 2013-02-15 16:55:04

+0

@invertedSpear,這聽起來像你聲稱我將它分成2個線程,使我更容易,犧牲了所有使用SO的人。諷刺的是,這恰恰相反!對我來說,擁有一個單一的線程會更容易,但是我特別創建了一個新的線程來爲其他人更容易製作。在我的特殊情況下,這兩個問題背後都有一個目標,但實際上,這兩個問題可以獨立工作。 JAGAnalyst的回答其實只回答了其他的帖子,不是這一個。 – as9876 2013-02-18 00:35:57

回答

2

這個問題是對前一個問題的參考,數據和代碼示例張貼在這裏:

Access SQL Update One Table In Join Based on Value in Same Table

AYS嗨,

在Access中,更新查詢需要在一個表上運行。 由於UNION查詢是多個記錄集的組合,結果集不再是一個表,並且不能作爲Update查詢的對象,因爲結果集中的記錄不再能夠唯一標識任何一個特定的表(即使他們理論上可以)。訪問是硬編碼來將每個UNION查詢視爲只讀,這在有多個基礎表時很有意義。還有許多其他條件(如SELECT語句中的子查詢)也會觸發此條件。

想想看是否如此:如果您沒有使用TOP 1並且您的UNION查詢返回了多個結果,那麼JET如何知道將哪個結果應用於表中的唯一記錄?因此,JET將所有這些情況都視爲相同。

不幸的是,即使所有數據都是從同一張表派生的,情況也是如此。在這種情況下,JET優化器很可能不夠聰明,無法意識到這種情況,並且以不使用UNION的方式重新定位查詢。

在這種情況下,您仍然可以通過以一種方式重新聲明您的查詢來獲得您想要的內容,從而使所有內容都引用基表。例如,你可以使用下面的SELECT查詢來獲取先前SHP_CUSTOM_5記錄的PO_NUM值:

SELECT 
t1.SHP_CUSTOM_5 
, t1.PO_NUM 
, t1.SHP_CUSTOM_5 -1 AS PREV_RECORD 

, (SELECT 
t2.PO_NUM 
FROM 
tempSpring_ASN As t2 
WHERE 
t2.SHP_CUSTOM_5 = (t1.SHP_CUSTOM_5 -1) 
) AS PREV_PO 

FROM 
tempSpring_ASN AS t1 
; 

然後,您可以短語以此爲更新查詢作爲以執行「LIN」的更新如下:

UPDATE 
tempSpring_ASN AS t1 

SET 
t1.RECORD_TYPE = "LIN" 

WHERE 
t1.PO_NUM= 

(
SELECT 
t2.PO_NUM 

FROM 
tempSpring_ASN As t2 

WHERE 
t2.SHP_CUSTOM_5 = (t1.SHP_CUSTOM_5 -1) 
) 
; 

此代碼在我使用虛擬數據運行的測試中成功。

關於您的「HDR」更新,您真的會執行兩個單獨的更新。 1)如果PO_NUM先前記錄的PO_NUM,設置RECORD_TYPE匹配「LIN」 2)如果是第一個記錄,設置RECORD_TYPE爲「HDR」

這是我不清楚爲什麼會有一個好處在一個查詢中執行這些操作。我建議使用您在原始SELECT查詢示例中使用的SHP_CUSTOM_5方法使用「TOP 1」執行HDR更新,因爲這將是一個相對簡單的UPDATE查詢。在更新查詢中可以使用IIF(),但我不知道從額外的時間和複雜度中可以獲得哪些額外的好處(它很可能只會少得多)。

祝你好運!

+0

您的查詢沒有任何「錯誤」。訪問只是說你不能,所以你不能。 – JAGAnalyst 2013-02-15 16:02:55

相關問題