2016-02-19 68 views
0

我们正在为我们的数据库模式添加一个表。它与已经存在的表格有关系,我们为其添加了一个外键。请注意,我没有创建这个模式,也没有改变太多的权限。该应用程序已经运行了一段时间,他们犹豫改变很多。SQL左加入两个可能的列

USER_ACTIVITY_T(preexisint表 - 唯一的相关列简称)

  • ACTIVITY_ID(PK)
  • 用户名
  • 设备ID(FK - 最近添加)

MACHINE_T(新表)

  • machineid(pk - 自动递增)
  • 计算机名(唯一)

从我加入到机台点,它收集机器数据;让用户看到活动期间涉及哪些机器。这很有用,但它只显示实施数据。一位领导问我试图通过参考与机器相关联的用户名来填充先前存在的记录。我们知道这不是100%准确的,但是...是的。我们的想法是将用户名添加到MACHINE_T中,并以追溯方式在报告中填充机器名称(假定用户只使用一台机器并且从未更改其用户名)。

那么,新MACHINE_T表看起来像:

MACHINE_T(新表)

  • 设备ID(PK - 自动递增)
  • 计算机名(唯一)
  • 用户名

现在,我们目前的SQL是:

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

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

回答

1

您想要选择连接列不为null时的连接,并且当它为空时从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他们这样。

+1

'SELECT * FROM USER_ACTIVITY_T LEFT JOIN MACHINE_T ON MACHINE_T.machineid = USER_ACTIVITY_T.machineid WHERE USER_ACIVITY_T.machineid IS NOT NULL'如果** ** MACHINE_T.machineid不为空,所以这是一个INNER JOIN LEFT OUTER代替JOIN你可以切断where子句 – jean

+0

是真的。我复制了粘贴原始查询并添加了忽略连接的子句。我将编辑答案以反映这 – Anton

+0

实际上,左连接无论如何都在做这项工作。我会澄清 – Anton

0

而且,我刚刚发现了UNIION算子,它可以帮助我解决这个问题。但是,我接受其他解决方案。