返回不在某个表中的结果的查询

时间:2016-04-14 16:04:34

标签: sql sql-server sql-server-2012

下面的查询选择特定buildID的周(weekId)使用的所有部分(partId)和目录(catalogId)

- 每个构建都有一组目录和目录部分。

select bw.weekId, epl.catalogId, wep.logId, epl.id, wep.partId, c.catalogName, cp.partName
            from engine.thisWeeksEngineParts wep
            inner join engine.EnginePartsList epl  ON wep.logId = epl.Id
            inner join engine.buildWeek bw ON epl.weekId = bw.weekId
            inner join engine.catalog c ON epl.catalogId = c.catalogId
            inner join engine.catalogParts cp ON wep.partId = cp.partId
            where bw.buildID = 1994334936
            order by weekId, catalogId, partId

现在我想要一个反向查询,向我显示与上面查询相反的内容。因此,我不想选择一周使用的所有目录和部件作为buildID,而是希望看到每个目录中未用于buildID的所有部件。

所以我仍然希望看到目录,但我希望看到这些目录中所有未使用的部分。

我尝试在engine.catalogParts上使用右连接,但只返回相同数量的结果。

以下是catalog和catalogParts表的表定义:

CREATE TABLE [engine].[catalogParts](
    [partId] [bigint] NOT NULL,
    [catalogId] [bigint] NOT NULL,
    [partName] [nvarchar](max) NOT NULL,
 CONSTRAINT [pk_catalogParts] PRIMARY KEY CLUSTERED 


CREATE TABLE [engine].[catalog](
    [catalogId] [bigint] NOT NULL,
    [buildId] [int] NULL,
    [catalogName] [nvarchar](max) NOT NULL,
    [discriminator] [char](3) NOT NULL
 CONSTRAINT [pk_catalog] PRIMARY KEY CLUSTERED 

示例数据:

这是一个示例,它使用我的第一个查询显示第101周中使用的目录中的3个不同部分:

weekId | catalogId | logId | id | partId | catalogName | partName
101          11        66    66     29       V6_Eng       piston_01
101          11        66    66     40       V6_Eng       ring_00a
101          11        66    66     77       V6_Eng       valve_202194

我希望新查询显示的是第101周未使用的所有部分,所以像这样:

weekId | catalogId | logId | id | partId | catalogName | partName
101          11        66    66     29       V6_Eng       manifold_upper_44
101          11        66    66     40       V6_Eng       manifod_lower_44c
101          11        66    66     77       V6_Eng       camshaft_229

谢谢!

0 个答案:

没有答案