2010-08-06 2 views
1

원본에서 이미지를 생성하여 테이블에 저장하고 있습니다. 나는 간격을 검사 할 쿼리를 원한다.브리지/데이터 교차 테이블에서 "누락 된"레코드 찾기

이미지 크기는 세 번째 테이블에 보관되며 각 원본에는 형식 테이블의 각 레코드에 대해 생성 된 이미지가 1 개 있어야합니다.

는 어디에서 지금까지있어 무엇 : 작동

SELECT oi.OriginalImageID, it.ImageTypeID 
FROM dbo.OriginalImages AS oi 
CROSS JOIN 
     dbo.ImageType AS it 
LEFT OUTER JOIN 
      (
      SELECT oi2.OriginalImageID, it2.ImageTypeID 
      FROM dbo.OriginalImages AS oi2 
      INNER JOIN 
        dbo.GeneratedImages AS gi2 ON gi2.OriginalImageID = oi2.OriginalImageID 
      INNER JOIN 
        dbo.ImageType AS it2 ON it2.ImageTypeID = gi2.ImageTypeID 
      ) AS sub ON sub.OriginalImageID = oi.OriginalImageID 
         AND sub.ImageTypeID = it.ImageTypeID 
WHERE (sub.OriginalImageID IS NULL) 

, 그러나 그것은 매우 추한 것 같다. 더 우아한 방법이 있는지 궁금하네요.

표는 기본적으로 다음과 같이 :

OriginalImages 
    OriginalImageID (PK) 
    Image 

GeneratedImages 
    OriginalImageID (FK) 
    ImageTypeID (FK) 
    Image 

ImageType 
    ImageTypeID (PK) 
    Description 

답변

3

당신은 당신의 기존 쿼리를 단순화 할 수 있어야한다 : 개인적으로 내가 사용하는 것이지만

SELECT oi.OriginalImageID, it.ImageTypeID 
FROM dbo.OriginalImages AS oi 
CROSS JOIN 
     dbo.ImageType AS it 
LEFT OUTER JOIN 
     dbo.GeneratedImages AS gi2 
     ON gi2.OriginalImageID = oi.OriginalImageID AND 
     gi2.ImageTypeID = it.ImageTypeID 
WHERE gi2.OriginalImageID IS NULL 

해당 없음이 존재 :

SELECT oi.OriginalImageID, it.ImageTypeID 
FROM dbo.OriginalImages AS oi 
CROSS JOIN 
     dbo.ImageType AS it 
WHERE NOT EXISTS 
     (SELECT NULL FROM dbo.GeneratedImages AS gi2 
     WHERE gi2.OriginalImageID = oi.OriginalImageID AND 
       gi2.ImageTypeID = it.ImageTypeID) 

(수정 된 덧글)

+0

험, 아니요. 나는 원래의 쿼리에서 필요한 레코드를 얻고있다. 그러나 이들 중 하나로부터 아무 결과도 얻지 못합니다. 현재 4 가지 "유형"이 있으므로 dbo.GeneratedImages를 선택하십시오. gi2 WHERE gi2.OriginalImageID = oi.OriginalImageID는 GeneratedImages 테이블에 유형 중 하나라도있는 경우 null을 반환하지 않습니다. –

+0

@ Dan - 죄송 합니다만, 가입의 상당 부분을 놓쳤습니다. 업데이트 된 쿼리를 사용해보십시오. –

+0

뜨거운! 도움을 주셔서 감사합니다, 내가 두 번 upvote 수 있으면 좋겠다! –

관련 문제