2012-02-08 56 views
0

我有3個表。包含可供下載的各種應用程序的信息的應用程序(相關字段是App​​ID)表,包含可用各種可下載項目的信息的軟件包表(相關字段爲PackageID)和App/Packages表(相關字段是App​​ID和PackageID)顯示應爲每個應用程序下載哪些軟件包。我需要一個查詢來找出哪些軟件包與特定應用程序無關。需要不同連接的三個表的SQL查詢

我的想法是INNER JOIN應用程序到AppPackages以獲得與應用程序相關的所有包列表,然後將此結果集OUTER JOIN加入到包並找到所有空結果以顯示哪些包不相關。

問題是我似乎無法解決如何鏈接這些查詢。子查詢似乎不起作用,並且EXIST/NOT EXIST需要來自外部查詢的信息,這是我無法工作的。我假設我有一些簡單的東西,但是我讀到的所有文獻都是兩張表,不超過兩張。

這是我的最佳嘗試,但EXISTS部分因上述原因不起作用。

SELECT Packages.PackageID FROM Packages WHERE NOT EXISTS 
(Select AppPackages.PackageID, AppPackages.AppID FROM AppPackages WHERE AppPackages.AppID = @AppID) 

預先感謝任何幫助:)

乾杯,

馬特:)

回答

1

我需要一個查詢來找出哪些包不涉及到具體的應用。

SELECT 
    * 
FROM 
    Packages p 
WHERE 
    NOT EXISTS (
    SELECT 1 
     FROM Applications a 
      INNER JOIN AppPackages ap ON ap.PackageId = p.PackageId 
    WHERE ap.AppId = <Your App ID> 
) 
+0

這樣做的工作完全(也似乎到目前爲止有限的測試),非常感謝!我以前從來沒有見過SELECT 1 ..我必須瞭解它是如何工作的。 – 2012-02-08 13:52:17

+0

@Matty W:'SELECT 1'只是'SELECT *'的另一種形式。這是一種更明確的說法,即你不需要返回任何列。 – Tomalak 2012-02-08 14:17:41

+0

好的,所以我試圖在我的asp.net網站中使用這個查詢的輸出,但是看起來4列中的每一列的列名是相同的... PackageID。這是預期的嗎? – 2012-02-09 09:53:49

0

我會嘗試某事像這樣:

SELECT Packages.PackageID FROM Packages WHERE Packages.PackageID NOT IN 
(Select AppPackages.PackageID FROM AppPackages WHERE AppPackages.AppID = @AppID) 
+0

感謝您的回覆。我被要求在查詢中使用IN,因爲顯然這是一個更加密集的操作。因此,由於Tomalak的答案有效,我還沒有嘗試過使用它。 – 2012-02-08 13:54:36