我们正在向我们的数据库模式添加一个表。它与已经存在的表有关系,我们为其添加了外键。请注意,我没有创建此架构,也没有权限进行大量更改。该应用程序已经运行了一段时间,他们不愿意进行太多更改。

USER_ACTIVITY_T(preexisint表-仅引用相关列)


activity_id(pk)
用户名
machineid(fk-最近添加)


MACHINE_T(新表)


machineid(pk-自动递增)
机器名(唯一)


从添加机器表的角度来看,它收集机器数据;允许用户查看活动期间涉及的计算机。这很有用,但仅显示从实现的角度来看的数据。一位负责人要求我尝试通过引用与计算机关联的用户名来填充先前存在的记录。我们知道这不是100%准确,但是...是的。我们的想法是将用户名添加到MACHINE_T中,并用作追溯地填充报告中的计算机名的方式(假定用户仅使用一台计算机,并且从未更改过用户名)。

因此,新的MACHINE_T表将如下所示:

MACHINE_T(新表)


machineid(pk-自动递增)
机器名(唯一)
用户名


现在,我们当前的SQL是:

SELECT * FROM `USER_ACTIVITY_T` LEFT JOIN `MACHINE_T`
ON MACHINE_T.machineid=USER_ACTIVITY_T.machineid


如果USER_ACTIVITY_T.machineid为null但具有匹配的用户名,是否有人对如何加入用户名有任何建议?对不起。这是一个奇怪的请求,我可能花太多时间进行过度分析。感谢您的任何帮助。我几乎想说它可以合理地做到。

最佳答案

当联接列不为空时,您要从a选择联接;如果联接列为空,则要从b选择联接。

但是,您不希望重复信息,因此UNION可能会自行导致问题。

尝试仅在第一个联接上选择非空条目,然后在合并它们之前从第二个联接中排除空条目。

所以:

   SELECT *
   FROM `USER_ACTIVITY_T`
   LEFT JOIN `MACHINE_T`
   ON MACHINE_T.machineid = USER_ACTIVITY_T.machineid

   UNION ALL

   SELECT *
   FROM `USER_ACTIVITY_T`
   JOIN `MACHINE_T`
   ON MACHINE_T.username = USER_ACTIVITY_T.username
   WHERE USER_ACTIVITY_T.machineid IS NULL


这样,您基本上是对空条目使用一个查询,对非空条目使用一个查询,然后对它们进行UNIONing。

09-27 21:06