13

当我在下面的示例中执行两个 LEFT JOIN 以到达“event_name”时,我得到了重复。以这种方式设置,我得到了 112 个案例。但是,如果我去掉 2 LEFT JOIN 行并运行查询,我会得到正确的 100 条没有重复的记录。我用下面的代码尝试了 DISTINCT,但我仍然得到 112 重复。

SELECT "cases"."id", "cases"."date", "cases"."name", "event"."event_name" 
FROM "cases"
LEFT JOIN "middle_table" ON "cases"."serial" = "middle_table"."m_serial"
LEFT JOIN "event" ON "middle_table"."e_serial" = "event"."ev_serial"
WHERE "cases"."date" BETWEEN '2012-12-11' AND '2012-12-13'

如何指定我只想要“案例”中的确切 100 个案例,并且我不希望连接中的表中的任何内容生成更多行?

谢谢!

4

3 回答 3

9

您需要扩展您的 ON 子句以包含一个条件,以便对于其中的每个条目,cases只有一个middle_table与条件匹配的条目,并且对于其中的每个条目,在middle_table中只有一个条目event

LEFT JOIN middle_table ON cases.serial = middle_table.m_serial AND some_condition

您当然可以使用 DISTINCT。如果这不起作用,则意味着您的结果在字段cases.idcases.datecases.name中都不同event.event_name。检查结果并决定要丢弃哪些条目并将该条件包含在您的 ON 子句中。

于 2012-12-19T00:46:09.230 回答
8

问题是您要加入的表中有多个匹配项。实际上,您的代码说:

select *
from parent
left outer join child on parent.id = child.parentId

如果父母有两个孩子,你会得到两个;所以父母出现了两次。

如果您只想在需要妥协时得到父母;你不能同时拥有两个孩子。对子表中的列执行聚合函数并对父表中的列执行分组,或者rownumber() over partition by (list,of,parent,columns order by list,of,child,columns) r在内部语句和where r=1外部语句中使用,如下所示:

select p.id, p.name, max(c.id), max(c.name) --nb: child id and name may come from different records
from parent p
left outer join child c on parent.id = child.parentId
group by p.id, p.name

或者

select *
from 
(
    select p.id, p.name, c.id, c.name
    , rownumber() over (partition by p.id order by c.id desc) r
    from parent p
    left outer join child c on parent.id = child.parentId
) x
where x.r = 1

更新

如评论中所述,如果子数据完全相同,您可以这样做:

select p.id, p.name, c.name
from parent p
left outer join 
(
    select distinct c.parentId, c.name
    from child
) c on parent.id = child.parentId

或(如果有几个字段不同但您不在乎得到哪个字段)

select p.id, p.name, c.id, c.name
from parent p
left outer join 
(
    select max(c.id) id, c.parentId, c.name
    from child
    group by c.parentId, c.name
) c on parent.id = child.parentId
于 2012-12-19T00:51:34.837 回答
1

重复项是“middle_table”具有多个字段,“case”具有多个字段的结果。您可以使用“GROUP BY”关键字(通常用于整理函数,例如 COUNT 和 SUM)将选择限制为唯一的值,如下所示:

SELECT "cases"."id", "cases"."date", "cases"."name", "event"."event_name" 
FROM "cases"
LEFT JOIN "middle_table" ON "cases"."serial" = "middle_table"."m_serial"
LEFT JOIN "event" ON "middle_table"."e_serial" = "event"."ev_serial"
GROUP BY  "cases"."id", "cases"."date", "cases"."name", "event"."event_name" 
WHERE "cases"."date" BETWEEN '2012-12-11' AND '2012-12-13'
于 2012-12-19T01:56:55.137 回答