在此之前,我想说英语不是我的母语,如果我的任何解释含糊或不合理,请让我知道,我将尝试使它们更清楚。 / 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.OwnerId
和tlbExtraFieldData.FieldId = tblExtraFieldDef.Id
任何指针都将不胜感激,因为这越来越令人沮丧。
答案 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
)
是您需要的吗?