【问题标题】:Joining tables for dynamic results?加入表格以获得动态结果?
【发布时间】:2016-03-25 02:33:48
【问题描述】:

我正在尝试加入这两个表。让我们调用一个员工,另一个员工信息:

Employees
Name         Title         ID
-------      -------     ------
John         Consultant    1
John         Engineer      2
Jane         Accountant    3

Employee Information
Name         EmailAddress    Project
------       -------------   ----------
John         John@work.com    Travelling
John         John1@work.com   Database Maintenance

我正在尝试加入表格,使其看起来像这样:

Desired Results
Name      Title       EmailAddress     Project
------    -----       -------------    ----------
John     Consultant   John@work.com    Travelling
John     Engineer     John1@work.com   Database Maintenance

但我不断得到这样的东西:

Actual Results
Name      Title       EmailAddress     Project
------    -----       -------------    ----------
John     Consultant   John@work.com    Travelling
John     Engineer     John@work.com    Database Maintenance
John     Consultant   John1@work.com   Travelling
John     Engineer     John1@work.com   Database Maintenance

我正在运行与此类似的查询:

SELECT * FROM Employees E INNER JOIN
EmployeeInformation EI ON E.Name = EI.Name

看着它,我可以理解为什么行数翻倍,但我似乎无法找到获得所需输出的方法,有什么建议吗?还是因为我的过滤器太模糊而无法实现?

【问题讨论】:

    标签: sql database join


    【解决方案1】:

    您正在加入一个非唯一字段,这意味着它将为每个 E.Name = "John"/EI.Name = "John" 组合返回一行。

    要解决此问题,您需要找到或创建一个在两个表之间具有 1:1 关系的字段。 (假设每个员工在您的 EI 表中只有一行。)

    例如,您可以利用 E.ID 来匹配您的 EI 表吗?

    如果数据结构良好,EI 表上应该有一个外键字段对应于 Employee 表中的主键(应该是 E.ID)。

    【讨论】:

      【解决方案2】:

      Employeeinformation 表应该有employees 表的主键。 请更改您的表结构,尝试向Employee informationtable 添加一列并从employees 表更新ID。

      【讨论】:

        【解决方案3】:

        你的例子告诉我:

        John has three titles.
        John has two email addresses.
        There is no relations that tells us which email goes with which title.
        

        这个事实从根本上就是为什么您会看到您所看到的结果。您的数据显示两封电子邮件都带有所有标题。如果您想将特定的电子邮件地址分配给特定的人员/职位组合,您的架构需要更改。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-05
          • 1970-01-01
          相关资源
          最近更新 更多