2010-08-06 2 views
1

Я генерирую изображения из оригинала и сохраняя их в таблице. Я хочу запрос, который будет проверять пробелы.Найдите «отсутствующие» записи в таблице пересечения моста/данных

Размеры изображения хранятся в 3-й таблице, и каждый оригинал должен иметь 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 типа «, поэтому SELECT NULL FROM dbo.GeneratedImages AS gi2 WHERE gi2.OriginalImageID = oi.OriginalImageID не будет возвращать null, если в таблице GeneratedImages есть даже один из типов. –

+0

@ Dan - К сожалению, я пропустил значительную часть соединения - попробуйте обновленные запросы. –

+0

Горячий! Спасибо за помощь, хотелось бы, чтобы я мог дважды повышать! –

Смежные вопросы