Sql 查找“;“失踪”;桥/数据相交表中的记录

Sql 查找“;“失踪”;桥/数据相交表中的记录,sql,tsql,sql-server-2008,Sql,Tsql,Sql Server 2008,我从原始图像生成图像并将其存储在表中。我想要一个可以检查间隙的查询 图像大小保存在第三个表中,每个原始文件的类型表中的每个记录都应有一个生成的图像 到目前为止我得到了什么: SELECT oi.OriginalImageID, it.ImageTypeID FROM dbo.OriginalImages AS oi CROSS JOIN dbo.ImageType AS it LEFT OUTER JOIN ( SELECT

我从原始图像生成图像并将其存储在表中。我想要一个可以检查间隙的查询

图像大小保存在第三个表中,每个原始文件的类型表中的每个记录都应有一个生成的图像

到目前为止我得到了什么:

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

您应该能够将现有查询简化为:

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)

(根据评论编辑。)

嗯,不。我正在从原始查询中获取所需的记录。但这两项都没有结果。当前有4个“类型”,因此从dbo.generateImage中选择NULL作为gi2,其中gi2.OriginalImageID=oi.OriginalImageID将不会返回NULL,如果generateImage表中甚至有一个类型。@Dan-Oops,我错过了连接的重要部分-尝试更新的查询。