2011-06-27 38 views
3

我有一個Access .mdb數據庫。有兩個結構相同的表格:價格和tmpPrices。每個表格有三列:[截至日期標準](日期/時間),價格(雙倍),CUSIP(文本,255個字符)。 tmpPrices包含要添加到價格的新記錄。我有兩個SQL查詢來從tmpPrices更新價格,一個使用WHERE連接,另一個使用INNER JOIN。使用INNER JOIN與NOT EXISTS訪問INSERT語句給出錯誤結果

下面的A版本可以正常工作:

INSERT INTO [Prices] SELECT * FROM [tmpPrices] WHERE NOT EXISTS 
(SELECT * from [Prices] 
    WHERE ([Prices].[As of date std] = [tmpPrices].[As of date std]) 
    AND ([Prices].CUSIP = [tmpPrices].CUSIP)); 

,而這個版本B不工作:

INSERT INTO [Prices] SELECT * FROM [tmpPrices] WHERE NOT EXISTS 
(SELECT [Prices].* FROM [Prices] INNER JOIN [tmpPrices] ON 
    ([Prices].[As of Date std] = [tmpPrices].[As of Date std]) 
    AND ([Prices].CUSIP = [tmpPrices].CUSIP)); 

兩個子查詢產生相同的結果:記錄:從tmpPrices一個子集,已經存在於價格中。

使用版本A無關緊要如果不是我必須更新其他表,而另一個表則需要大約45分鐘才能使用版本A進行更新,但只能使用版本B的一小部分,並且似乎可行正確。所以我想了解這裏發生了什麼。

回答

3

作爲@devsh的建議,LEFT JOIN絕對是一種可行的方式,但不需要使用子查詢。我在Access的查詢設計器中構建了它,它可以在你所描述的表格的Access 2003中工作。我沒有重新命名[截至日期標準]以消除空格。

INSERT INTO Prices (As_of_Date_std, Price, CUSIP) 
SELECT t.As_of_Date_std, t.Price, t.CUSIP 
FROM 
    tmpPrices AS t 
    LEFT JOIN Prices AS p 
    ON (t.As_of_Date_std = p.As_of_Date_std) AND (t.CUSIP = p.CUSIP) 
WHERE (((p.As_of_Date_std) Is Null)); 
+0

即使在有150萬行的桌子上,您的解決方案也很簡潔,執行速度非常快。 – GreatKing

1

第二個查詢不起作用,因爲查詢的選擇部分(您嘗試從中插入)與所包含的子查詢之間沒有鏈接。如果你要使用插入該格式,你可以這樣做:

INSERT INTO [Prices] 
SELECT [As of Date], Price, CUSIP 
FROM 
(SELECT tmpPrices.[As of Date std], tmpPrices.[Price], tmpPrices.[CUSIP] 
FROM tmpPrices LEFT JOIN Prices ON 
([Prices].[As of date std] = [tmpPrices].[As of date std]) AND ([Prices].CUSIP = [tmpPrices].CUSIP)) WHERE Prices.[As of date std] is null) 
+0

當我嘗試運行它時,您的回答給了我一個循環引用。我正在使用hansup的解決方案,但我會給你留下我發現非常聰明的LEFT JOIN。不幸的是,我沒有足夠的積分投票。 – GreatKing

0

A被這麼長時間,因爲它基本上是做tmpPrices的全表掃描每一個紀錄的價格,因爲沒有實際的加盟在子查詢中定義。

讓我們看看我們是否能爲您提供一個快速查詢,爲您提供所需的信息。

tmpPrices將需要一個自動編號字段才能工作,我建議將它作爲tmpPrices的pk。還有一個基於3個其他字段的唯一鍵,用於防止tmpPrices中的重複(很確定您可以在Access中執行此操作)。

INSERT INTO [Prices] ([As of Date std],[Price],[CUSIP]) 
SELECT [As of Date std],[Price],[CUSIP] from tmpPrices where autoNumberID not in(
    SELECT autonumberID 
    FROM tmpPrices 
    innerJoin prices on [Prices].[As of Date std] = [tmpPrices].[As of Date std] 
    AND [Prices].CUSIP = [tmpPrices].CUSIP 
) query1 

這也將有助於保持快速的東西,如果你在tmpPrices每次更新這個價格清除任何記錄。

+0

不幸的是,我無法使用你的解決方案,因爲我不允許改變表格的結構。 – GreatKing