2012-02-08 3 views
0

세 개의 테이블이 있습니다. 사용 가능한 다양한 다운로드 가능한 항목에 대한 정보를 포함하는 Packages 테이블 (관련 필드는 PackageID 임) 및 App/Packages 테이블 (관련 필드는 AppID 및 PackageID)을 포함하는 응용 프로그램 (관련 필드는 AppID) 테이블 각 응용 프로그램에 대해 다운로드해야하는 패키지를 보여줍니다. 특정 응용 프로그램과 관련이없는 패키지를 찾으려면 쿼리가 필요합니다.서로 다른 조인이 필요한 SQL 쿼리에 대한 SQL 쿼리

내 아이디어는 응용 프로그램과 관련된 모든 패키지의 목록을 얻고이 결과 세트를 패키지로 조인하고 모든 null 결과를 찾아 관련되지 않은 패키지를 표시하는 AppPubages 응용 프로그램에 연결하는 것이 었습니다.

문제는 이러한 쿼리를 연결하는 방법을 알아낼 수 없다는 것입니다. 하위 쿼리는 작동하지 않는 것처럼 보이고 EXIST/NOT EXIST에는 외부 쿼리의 정보가 필요합니다.이 쿼리는 방금 작업하지 못합니다. 나는 헷갈 린다는 단순한 가정이 있다고 생각하지만, 읽은 모든 문헌은 2 개 이상의 테이블을위한 것이지 결코 2 개 이상을위한 것이 아닙니다.

이것은 최선의 시도이지만 위의 이유로 인해 존재하지 않는 부분이 작동하지 않습니다. 어떤 도움 :)

환호에 미리

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 웹 사이트 에서이 쿼리의 출력을 사용하려고했지만, 그것은 각 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을 사용하는 것을 막으라는 질문을 받았습니다. 그와 Tomalak의 대답이 작동하기 때문에 나는 이것을 사용하려하지 않았다. –