我在Sql中有2个表(EqmType和Equipment)
一台设备只能有1个eqmtype。 eqmtype可以有多个设备。
EqmType
- EqmtId
- EqmtDescr
设备
- EqmId
- EqmEqmtId(EqmType的外键)
- Eqmrecstatus(值2有效,8缺失,16是ToDelete,...)
输出必须是EqmType中所有行的列表,其中只包含值为eqmrecstatus的设备等于16.
例如:
一个eqmtype有10个设备。其中9个为eqmrecstatus的值为16,而1为2 =>不在结果列表中
一个eqmtype有10个设备。所有10个都有16作为eqmrecstatus =>的值。在结果列表中
如果不清楚,请告诉我:)。
答案 0 :(得分:1)
您可以在两个表上应用连接,然后使用where
子句应用过滤器。但它是1-n
关系,因此您可能希望应用Distinct
,因为您只需要EqmType
表中的数据。Read more about join。
Select DISTINCT e.EqmtId,e.EqmtDescr
FROM EqmType e join Equipment eq
ON e.EqmtId = eq.EqmtId
WHERE eq.Eqmrecstatus = 16
答案 1 :(得分:1)
我认为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 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
是一种更安全的选择。