返回子对象中不存在字段的对象

时间:2019-01-26 17:07:07

标签: sql-server tsql

在此之前,我想说英语不是我的母语,如果我的任何解释含糊或不合理,请让我知道,我将尝试使它们更清楚。 / em>

我要完成的工作是编写一个查询,该查询从tblObject返回一个对象列表,这些对象没有分配10006到10009之间的FieldId。参照下表,仅应返回ID为10056的对象,因为10054的所有子对象都被分配为不有趣。

开始时,我使用以下查询,只是为了查看是否可以过滤掉未分配给OwnerId的对象。我设法做到了,但未能将其合并到查询中,仅从tblObject返回对象。

SELECT
    *
FROM
    tblExtraFieldDef
WHERE
    tblExtraFieldDef.Id BETWEEN 10006 AND 10009 AND NOT EXISTS(
        SELECT
            FieldId
        FROM
            tblExtraFieldData
        WHERE
            tblExtraFieldData.OwnerId = 10056 AND tblExtraFieldData.FieldId = tblExtraFieldDef.Id)

表格数据

tblObject
Id      CustomerId  ParentId    Status      Nr
10054   0           10013       0           O2-10023
10056   0           10055       0           O2-10024

tblExtraFieldData
FieldId OwnerId Value               Id
10005   10054   2                   10005
10006   10054   2019-01-24T00:00:00 10006
10008   10054   2019-01-25T00:00:00 10014
10009   10054   2019-01-25T00:00:00 10015
10007   10054   2019-01-26T00:00:00 10016
10005   10056   4                   10011
10006   10056   2019-01-25T00:00:00 10012
10007   10056   2019-01-25T00:00:00 10013

tblExtraFieldDef
Id      OwnerType   Category    Name        Type    Format
10005   9           General     Per year    2
10006   9           General     Service 1   4       yyyy-MM-dd
10007   9           General     Service 2   4       yyyy-MM-dd
10008   9           General     Service 3   4       yyyy-MM-dd
10009   9           General     Service 4   4       yyyy-MM-dd

正如Alex所指出的,我并没有弄清楚tblObject与其他表的关系。 tblObject.Id = tlbExtraFieldData.OwnerIdtlbExtraFieldData.FieldId = tblExtraFieldDef.Id

任何指针都将不胜感激,因为这越来越令人沮丧。

2 个答案:

答案 0 :(得分:1)

我想我理解您的要求。您试图找到差距,在数据表中不存在对象ID和定义ID的每种组合。出于此要求,以下查询语句应为您提供所需的信息。

SELECT
  X.OBJ_ID,
  X.DEF_ID
FROM
(
  SELECT tblExtraFieldDef.ID AS DEF_ID, tblObject.ID AS OBJ_ID
  FROM tblExtraFieldDef, tblObject
  WHERE tblExtraFieldDef.ID Between 10006 And 10009
) AS X
LEFT JOIN tblExtraFieldData as DAT
  ON DAT.FieldID = X.DEF_ID and DAT.OwnerID = X.OBJ_ID
WHERE
  DAT.ID is NULL

from子句中的子查询标识对象ID和定义ID的所有组合,其中ID在10006到10009之间。使用左联接可以查找数据表中存在的所有匹配项和不匹配项。最后,WHERE子句通过查找NULL ID来过滤结果。左联接产生的Null ID是对象/定义组合无可用数据的结果。

希望这对您有帮助……祝您好运

答案 1 :(得分:0)

从字面上翻译问题描述:

  

查询,该查询从tblObject返回一个对象列表,这些对象没有分配10006到10009之间的FieldId。

SELECT * FROM tblObject O
 WHERE 
 NOT EXISTS(
   SELECT * FROM tblObjectFieldData D 
     WHERE
       O.id = D.OwnerId 
       AND D.FieldId BETWEEN 10006 and 10009
 ) 

是您需要的吗?