SQL LEFT JOIN在两个可能的列上

时间:2016-02-19 18:06:22

标签: mysql database

我们正在为数据库架构添加一个表。它与已存在的表有关系,我们为其添加了一个外键。请注意,我没有创建此架构,也没有更改权限。该应用程序已经运行了一段时间,他们对改变很多犹豫不决。

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

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

MACHINE_T(新表)

  • machineid(pk - auto increment)
  • machinename(unique)

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

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

MACHINE_T(新表)

  • machineid(pk - auto increment)
  • machinename(unique)
  • 用户名

现在,我们当前的SQL是:

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

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

2 个答案:

答案 0 :(得分:1)

您希望从连接列不为空时选择连接,而选择连接列为空时连接。

您不希望重复信息,因此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

这样,您基本上对null条目使用一个查询,对非null条目使用一个查询并对它们进行UNIONing。

答案 1 :(得分:0)

而且,我刚刚发现了UNIION运算符,它将帮助我解决这个问题。但是,我对其他解决方案持开放态度。