【问题标题】:How do I use a join to query two tables and get all rows from one, and related rows from the other?如何使用联接查询两个表并从一个表中获取所有行,并从另一个表中获取相关行?
【发布时间】:2010-09-22 19:18:52
【问题描述】:

例如,我有两个表,groupsitems

items (
    id,
    groupId,
    title
)

groups (
    id,
    groupTitle,
    externalURL
)

我的常规查询是这样的:

SELECT
    i.`id`,
    i.`title`,
    g.`id` as 'groupId',
    g.`groupTitle`,
    g.`externalURL`
FROM
    items i INNER JOIN groups g ON (i.`groupId` = g.`id`)

但是我现在需要修改它,因为所有指定externalURL 的组在items 表中都没有任何对应的记录(因为它们存储在外部)。是否可以进行某种连接以使输出看起来像这样:

items:
id    title    groupId
----------------------
1     Item 1   1
2     Item 2   1

groups
id    groupTitle    externalURL
-------------------------------
1     Group 1       NULL
2     Group 2       something
3     Group 3       NULL

Query output:
id    title    groupId    groupTitle    externalURL
---------------------------------------------------
1     Item 1   1          Group 1       NULL
2     Item 2   1          Group 1       NULL
NULL  NULL     2          Group 2       something

-- note that group 3 didn't show up because it had no items OR externalURL

这可以在一个 SQL 查询中实现吗?

【问题讨论】:

    标签: sql join


    【解决方案1】:

    这正是外连接的用途:返回一个表中的所有行,无论另一个表中是否有匹配的行。在这些情况下,为另一个表的所有列返回 NULL。

    您可以在 WHERE 子句中处理的其他条件。

    SELECT
        i.`id`,
        i.`title`,
        g.`id` as 'groupId',
        g.`groupTitle`,
        g.`externalURL`
    FROM
        items i RIGHT OUTER JOIN groups g ON (i.`groupId` = g.`id`)
    WHERE i.`id` IS NOT NULL OR g.`externalURL` IS NOT NULL;
    

    仅当i.idg.externalURL 为NULL 时,才应排除连接结果集的整行。

    【讨论】:

    • 我想我应该在 Databases 101 中多听一些,嘿?干杯。
    猜你喜欢
    • 2010-10-24
    • 2013-06-04
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多