2010-01-06 59 views
6

我有以下在MS SQL中正常運行的T-SQL查詢(簡單測試用例),但無法在MS Access(JET-SQL)中獲得等效查詢。問題在於LEFT JOIN中的附加標準。 如何在MS Access中執行此操作?在MS Access中的其他標準的左加入

T-SQL:

SELECT * FROM A 
LEFT OUTER JOIN B ON A.ID = B.A_ID 
       AND B.F_ID = 3 

JET-SQL(我有這麼遠,但崩潰訪問!):

SELECT * FROM dbo_A 
LEFT JOIN dbo_B ON (dbo_A.ID = dbo_B.A_ID AND dbo_B.F_ID = 3) 
+0

不應該在連接標準上需要括號 – 2010-01-06 20:16:01

+0

T-SQL示例是否是外連接有什麼關係?所有它基本上做的是返回在A中的所有行。 – Melvin 2010-01-06 22:07:53

+0

@OMG小馬 - 沒有括號,我得到一個語法錯誤,與他們,Access崩潰... @Melvin - 不,字OUTER是可選的。 – Supergibbs 2010-01-06 23:13:10

回答

10

您需要使用子查詢申請條件:

SELECT * 
    FROM dbo_A LEFT JOIN 
    [SELECT dbo_B.* FROM dbo_B WHERE dbo_B.F_ID = 3]. AS dbo_B 
     ON dbo_A.ID = dbo_B.A_ID; 

如果您正在運行的「SQL 92」開啓兼容模式訪問,你可以做更多的標準:

SELECT * 
    FROM dbo_A LEFT JOIN 
    (SELECT dbo_B.* FROM dbo_B WHERE dbo_B.F_ID = 3) AS dbo_B 
     ON dbo_A.ID = dbo_B.A_ID; 

您是否需要在Access中可以編輯它?如果沒有,只需使用帶有本機T-SQL的傳遞查詢。如果是這樣,我可能會爲此創建一個服務器端視圖,並且如果字面值是您要參數化的東西(即,F_ID = 3實際上是F_ID = N,其中N是在運行時選擇的值)。

順便說一下,我在Access中工作時每天都會寫這些子選擇派生表SQL語句。這不是什麼大不了的事情。

+0

是的,我知道我可以使用子查詢,但速度明顯較慢,所以我寧願使用左連接。雖然我不知道直通查詢選項,但它非常完美! (更多信息在這裏:http://support.microsoft.com/kb/303968)。自從它起作用以來,我將您的答案標記爲已接受。謝謝! – Supergibbs 2010-01-08 00:08:26

+1

子選擇是否較慢取決於兩件事情:1)涉及的數據庫引擎如何優化子選擇與替代選擇,以及在這種情況下顯而易見的選擇,2)該選項是否可用。在Jet/ACE SQL中,並不是因爲您不能在相反方向定義多字段聯接(即A => B,另一個來自B => A)。可能是因爲SQL Server與替代方案相比,SQL Server並沒有達到最優化,但是如果您使用的是Jet/ACE,則必須遵循Jet/ACE的規則,因此提及了passthrough。 – 2010-01-08 04:23:44

+1

我很確定左連接總是比子查詢更快。當然,在一個小數據集中,或者你的數據庫引擎可以優化(也就是把你的子選擇變成一個左連接),你不會看到區別,但是「左連接,然後選擇n行」將比「 n + 1選擇「。在我的情況下絕對是SQL Server更快地運行左連接。 – Supergibbs 2010-01-08 11:22:10

-4

這最後一個條件在技術上是不是一個加入,但比較到文字值。把它放在WHERE子句中:

SELECT * 
FROM a LEFT OUTER JOIN b ON a.ID = b.a_id 
WHERE b.f_id = 3; 
+5

這不是事實。在F_ID = 3的情況下,在左連接條件中檢查F_ID = 3會使B對於所有值爲null。將它放在where子句中根本不會返回它們。 – lins314159 2010-01-06 21:15:18

+0

對不起,我的意思是當F_ID <> 3時爲左連接而空。 – lins314159 2010-01-06 21:23:45

1

當它崩潰或它只是鎖定時,你會收到一條錯誤消息嗎?通過dbo_B名稱判斷,我猜測這些是Access中的鏈接表。我相信當你做一個類似Access的連接時,並不告訴SQL服務器它需要連接的結果,它說:「給我所有這兩個表的行」,然後嘗試連接它們本身。如果這些表非常大,則可能導致應用程序鎖定。

您可能更適合在SQL Server上創建您需要的視圖。

+0

絕對是一個好主意,這是否意味着我的語法正確只是Access無法處理它? – Supergibbs 2010-01-06 22:32:10

+0

我不知道Access本身是否有技術限制,但是如果表格是數百萬行,那麼運行Access的PC以及數據必須流動的網絡可能會不堪重負。 – 2010-01-07 02:52:30

+0

Jet/ACE請求整個表並進行連接本身並不是真的,除非阻止Jet/ACE獲取它需要的元數據來確定它是否可以將整個事情傳遞給服務器(應該在99%的情況下是這種情況)。或者,可能會有一些關於阻止Jet/ACE執行此工作的鏈接表(可能是視圖)。這些是我能想到的唯一的兩種情況,可能導致Jet/ACE使用提供的SQL請求整個表。總之,這是非常非常不可能發生的。 – 2010-01-07 02:54:46