3

简化例如,我有两个表,groups并且items.

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`)

但是我现在需要修改它,因为所有指定 an 的组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 查询中实现吗?

4

1 回答 1

11

这正是外连接的用途:返回一个表中的所有行,无论另一个表中是否存在匹配行。在这些情况下,为另一个表的所有列返回 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 时,才应排除连接结果集的整行。

于 2008-11-18T03:42:44.910 回答