2012-02-08 9 views
0

私は3つのテーブルを持っています。利用可能な様々なダウンロード可能な項目に関する情報を含むPackagesテーブル(関連フィールドはPackageID)、およびApp/Packagesテーブル(関連フィールドはAppIDおよびPackageID)を含むアプリケーション(関連フィールドはAppID)テーブル。アプリケーションごとにダウンロードするパッケージを示します。特定のアプリケーションに関連していないパッケージを調べるためのクエリが必要です。異なるクエリを必要とする3つのテーブルのSQLクエリ

私のアイデアは、アプリケーションに関連するすべてのパッケージのリストを取得し、この結果セットをパッケージに結合し、どのパッケージが関連していないかを示すすべてのnull結果を見つけるためにAppPackagesへのアプリケーション結合でした。

問題は、私はこれらのクエリを連鎖させる方法を考えることができないということです。サブクエリは機能していないように見えますが、EXIST/NOT EXISTには外部クエリの情報が必要です。私は何かシンプルなものがあると思っていますが、私が読むすべての文献は2つのテーブルのためのものであり、決して2つ以上のものはありません。

これは私の最高の試みですが、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を見たことがありません。これがどのように機能するかを調べなければなりません。 –

+0

@Matty W: 'SELECT 1'は' SELECT * 'の代替形式です。これは、あなたが*実際に*返された列を望んでいないと言っているもう少し明示的な方法です。 – Tomalak

+0

私はasp.netのWebサイトでこのクエリの出力を使用しようとしましたが、4列のそれぞれの列名が同じです... PackageID。これは期待されていますか? –

0

私はこのようなSTHしようとするだろう:(まあこれまでの限られたテストでいるようだ)

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

ご返信ありがとうございます。私は明らかにそれははるかに集中的な操作のようにクエリでINを使用することを拒否するように求められてきました。そのように、トマラクの答えが働くので、私はこれを使って試したことはありません。 –

関連する問題