如何选择仅包含单个值的行

时间:2015-02-19 08:46:38

标签: sql-server row

我在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 =>的值。在结果列表中

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

2 个答案:

答案 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是一种更安全的选择。