如何 select 只包含一个值的行

How to select rows that contain only a single value

我在 Sql(EqmType 和设备)中有 2 个表
一个设备只能有 1 个 eqmtype。一个 eqmtype 可以有多个设备。

EqmType
- EqmtId
- EqmtDescr

设备
- EqmId
- EqmEqmtId(EqmType 的外键)
- Eqmrecstatus(值 2 处于活动状态,缺少 8,16 是 ToDelete,...)

输出需要是 EqmType 中仅包含 eqmrecstatus 值等于 16 的设备的所有行的列表。

例如:
一个 eqmtype 有 10 个设备。其中 9 个有 16 个作为 eqmrecstatus 的值,1 个有 2 => 不在结果列表中
一个 eqmtype 有 10 个设备。结果列表中的 eqmrecstatus => 所有 10 个的值都是 16

如果不清楚,请告诉我:)

您可以在 table 上应用联接,然后使用 where 子句应用过滤器。但它是 1-n 关系,所以您可能想要应用 Distinct,因为您只需要来自 EqmType table.Read more about join.[=16= 的数据]

  Select DISTINCT e.EqmtId,e.EqmtDescr
  FROM EqmType e join Equipment eq
       ON e.EqmtId = eq.EqmtId 
  WHERE eq.Eqmrecstatus = 16 

我认为 NOT EXISTS 是您需要的:

SELECT  et.EqmtId, et.EqmtDescr
FROM    EqmType AS et
WHERE   NOT EXISTS
        (   SELECT  1
            FROM    Equipment AS e
            WHERE   e.EqmEqmtId = et.EqmtId
            AND     e.Eqmrecstatus != 16
        );

你基本上得到了状态不是 16 的所有设备:

SELECT  e.EqmEqmtId
FROM    Equipment AS e

那么您将从主要 select 中删除这些结果。可能更直观的写法是:

SELECT  et.EqmtId, et.EqmtDescr
FROM    EqmType AS et
WHERE   et.EqmtId NOT IN (SELECT e.EqmEqmtId FROM Equipment AS e WHERE e.Eqmrecstatus != 16);

但是 NOT EXISTS 是一个更安全的选择。