2

我是关系表的新手。随着我了解的更多,我看到了 sql 语句的许多优点。但是我坚持了一些观点。

我寻找是否可以从 5 个表中获得所需数据集的单个表。其中一个名为“eta”的表用于连接其他 4 个表。

目的:一个电话号码或邮箱可以被多个用户使用,用户也可以有多个电话号码或邮箱。我想列出电话号码或电子邮件地址以及使用它们的用户名。

示例数据:请查看http://sqlfiddle.com/#!2/60acce 了解表结构和示例数据集

手机壳的最终预期最终结果如下:

  phone            name    extra
  45336467      ABC Co.   
  45336467      Gery      114
  45336467      Todd      117
  45336467      Adam      119

谢谢

编辑:表关系的解释。

表 'eta' 有 4 个具有表关系的字段。“自己”列显示公司、个人等值“f”表示公司,“k”表示其他人将用于不同的表格

v1_id 用于自己字段的引用表的 id ..

“res”列是指电子邮件和电话表。电话的值't'和电子邮件的'e'。v2_id 用于 res 字段的引用表的 id

4

1 回答 1

3

通过您的架构归档后,我相信以下查询应该适合您:

SELECT
    phone.tel AS phone,
    CASE WHEN person.name IS NULL THEN company.titles ELSE person.name END AS name,
    eta.extra AS extra
FROM
    eta
    LEFT JOIN person
        ON eta.v1_id = person.id
        AND eta.own = 'k'
    LEFT JOIN company
        ON eta.v1_id = company.id
        AND eta.own = 'f'
    JOIN phone
        ON phone.id = eta.v2_id
WHERE
    eta.res = 't'

这假设eta.res = 't'如果关系是“电话”表。此外,eta.own = 'k'对于人,eta.own = 'f'对于公司。

它使用两个左连接从person/company表中拉取数据,以便在单个查询中完成拉取操作。如果该person.name列为空,则表示当前记录来自company表并将选择该值(对于名称列)。

同样可以选择电子邮件地址(假设eta.res = 'e'与电子邮件表相关):

SELECT
    email.email AS email,
    CASE WHEN person.name IS NULL THEN company.titles ELSE person.name END AS name
FROM
    eta
    LEFT JOIN person
        ON eta.v1_id = person.id
        AND eta.own = 'k'
    LEFT JOIN company
        ON eta.v1_id = company.id
        AND eta.own = 'f'
    JOIN email
        ON email.id = eta.v2_id
WHERE
    eta.res = 'e'
于 2012-11-07T14:58:17.903 回答