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,我错过了连接的重要部分-尝试更新的查询。