使用内部联接时,SQL 查询不返回空字段

问题描述 投票:0回答:1

我目前正在处理 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 

Example retrun of the query

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

我尝试简化并使用“选定方式”的左连接,但我正在努力实现所需的结果。有人可以帮我吗?

谢谢!

sql-server ms-access enterprise-architect
1个回答
0
投票

无论您在何处依赖“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”为空时不返回结果的问题。

© www.soinside.com 2019 - 2024. All rights reserved.