我目前正在处理 Microsoft Access 查询以填充 Enterprise Architect 中的模板。该查询主要是功能性的,但在根据“选定方式”的值检索 obj6 时遇到问题。具体来说,当“Selected Way”为空时,查询无法返回任何结果。理想情况下,即使该字段留空,它也应该返回所有其他值。
SELECT obj4.Name,
obj2.Name,
obj3.Name,
obj5.Name,
obj6.Name
FROM ((((((((((t_object obj
INNER JOIN t_connector con
ON ( con.end_object_id = obj.object_id
AND con.stereotype = 'Sterotype' ))
INNER JOIN t_object obj4
ON ( con.start_object_id = obj4.object_id ))
INNER JOIN t_objectproperties objp
ON ( obj4.object_id = objp.object_id
AND objp.property = 'Inbound' ))
LEFT JOIN t_object obj2
ON ( objp.Value = obj2.ea_guid ))
INNER JOIN t_objectproperties objp2
ON ( obj4.object_id = objp2.object_id
AND objp2.property = 'Outbound' ))
LEFT JOIN t_object obj3
ON ( objp2.Value = obj3.ea_guid ))
INNER JOIN t_objectproperties objp3
ON ( obj4.object_id = objp3.object_id
AND objp3.property = 'Tool' ))
LEFT JOIN t_object obj5
ON ( objp3.Value = obj5.ea_guid ))
INNER JOIN t_objectproperties objp4
ON ( obj4.object_id = objp4.object_id
AND objp4.property = 'Selected way' ))
INNER JOIN t_objectproperties objp5
ON ( obj4.object_id = objp5.object_id )
AND objp4.Value = objp5.property)
INNER JOIN t_object obj6
ON ( obj6.ea_guid = objp5.value )
WHERE obj.object_id = #userImput#
AND objp4.Value = objp5.property
ORDER BY obj4.Name ASC
inner join t_objectproperties objp4
on (obj4.object_id = objp4.object_id
and objp4.property = 'Selected way'))
inner join t_objectproperties objp5
on (obj4.object_id = objp5.object_id)
AND objp4.Value = objp5.property)
inner join t_object obj6
on (obj6.ea_guid = objp5.value)
WHERE obj.object_id = #userImput# AND objp4.Value = objp5.property
我尝试简化并使用“选定方式”的左连接,但我正在努力实现所需的结果。有人可以帮我吗?
谢谢!
无论您在何处依赖“Selected Way”值,请将内连接更改为左连接。这将确保返回主表(在您的情况下为 obj4)中的所有记录,即使连接表中没有相应的匹配项也是如此。
如果 WHERE 子句中有任何依赖于“Selected Way”的条件,您可能需要调整这些条件以适应“Selected Way”为空的情况。
确保连接条件正确反映表之间的关系,尤其是对于“Selected Way”等可选数据。
SELECT
obj4.Name,
obj2.Name,
obj3.Name,
obj5.Name,
obj6.Name
FROM t_object obj
INNER JOIN t_connector con ON con.end_object_id = obj.object_id AND con.stereotype = 'Sterotype'
INNER JOIN t_object obj4 ON con.start_object_id = obj4.object_id
LEFT JOIN t_objectproperties objp ON obj4.object_id = objp.object_id AND objp.property = 'Inbound'
LEFT JOIN t_object obj2 ON objp.Value = obj2.ea_guid
LEFT JOIN t_objectproperties objp2 ON obj4.object_id = objp2.object_id AND objp2.property = 'Outbound'
LEFT JOIN t_object obj3 ON objp2.Value = obj3.ea_guid
LEFT JOIN t_objectproperties objp3 ON obj4.object_id = objp3.object_id AND objp3.property = 'Tool'
LEFT JOIN t_object obj5 ON objp3.Value = obj5.ea_guid
LEFT JOIN t_objectproperties objp4 ON obj4.object_id = objp4.object_id AND objp4.property = 'Selected way'
LEFT JOIN t_objectproperties objp5 ON obj4.object_id = objp5.object_id AND objp4.Value = objp5.property
LEFT JOIN t_object obj6 ON obj6.ea_guid = objp5.value
WHERE obj.object_id = #userImput#
ORDER BY obj4.Name ASC
我已将相关联接更改为 LEFT JOIN,以确保左侧表中的所有记录都包含在结果中,无论右侧表中是否有相应的匹配项。这应该可以解决“Selected Way”为空时不返回结果的问题。