Найти «пропущенные» записи в таблице мостов / данных - PullRequest
1 голос
/ 06 августа 2010

Я генерирую изображения из оригинала и сохраняю их в таблице.Я хочу запрос, который проверит наличие пробелов.

Размеры изображений хранятся в третьей таблице, и для каждого оригинала должно быть 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

1 Ответ

3 голосов
/ 06 августа 2010

Вы должны иметь возможность упростить свой существующий запрос до:

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

Хотя лично я бы использовал NOT EXISTS:

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)

(Отредактировано после комментария.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...