如何 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
是一个更安全的选择。
我在 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
是一个更安全的选择。