【问题标题】:SQL - Return only records that have duplicate values in a specific column of a left outer joinSQL - 仅返回在左外连接的特定列中具有重复值的记录
【发布时间】:2017-02-01 22:42:49
【问题描述】:

我有以下疑问...

SELECT DISTINCT
  inv.name,
  loc.city,
  cls.color
FROM INVENTORY inv
INNER JOIN Model mod ON mod.id = inv.id
LEFT OUTER JOIN Location loc ON loc.id = mod.id
LEFT OUTER JOIN Class cls ON cls.id = mod.id
ORDER BY name, city asc;

这会给我以下...

   NAME    | CITY      | Color
1  Bob       New York    Red
2  Janet     Denver      Green
3  John      New York    Blue

但我想要的结果是……

   NAME    | CITY      | Color
1  Bob       New York    Red
2  John      New York    Blue

有几篇相似但似乎不适用于我的特定查询的帖子,因为我使用一个内连接和两个左外连接来连接多个表。非常感谢任何帮助!

【问题讨论】:

  • 您需要解释预期输出背后的逻辑。你只选择男性名字吗?东海岸的城市?
  • 你能更好地解释一下逻辑吗?重复什么和在哪里?另外,我删除了 sql-server 标记,因为大量证据表明是 Oracle。
  • 我很抱歉。我正在寻找在 City 列中返回具有任何重复值的行。谢谢大家!
  • 您为什么选择 DISTINCT - 是否可能有重复的行(这意味着它们具有相同的名称、相同的城市和相同的颜色)?如果这不可能,那么简单的 SELECT 就足够了。然后:如果可能出现重复,您是否希望这些行算作城市的“重复”,还是需要至少两次以不同的名称或不同的颜色找到该城市?
  • 我使用 DISTINCT 是因为我的实际查询更复杂,我正在简化它但试图保留主要结构。任何记录都可能在任何列中具有重复值,但我只对 CITY 列中具有重复值的记录感兴趣。如果整行是重复的,只要 CITY 列中的值是重复的,我想包含它。

标签: sql oracle join


【解决方案1】:

如果您只希望城市出现多次,请使用分析函数:

with t as (
      <your query here without the order by>
     )
select t.*
from (select t.*, count(*) over (partition by city) as city_cnt
      from t
     ) t
where city_cnt > 1;

【讨论】:

  • 或者将解析count()添加到原始查询中,不需要在单独的子查询中添加。
  • @mathguy 我知道我需要使用 count() 但我不确定在原始查询中使用它的最佳方式。
  • 这取决于你真正想要做什么,以及你的数据;我刚刚在对您原始帖子的评论中问了几个问题。
猜你喜欢
  • 2018-05-23
  • 1970-01-01
  • 2022-12-01
  • 2013-04-03
  • 2019-07-14
  • 2011-07-11
  • 2014-09-09
  • 2023-03-09
  • 2023-03-07
相关资源
最近更新 更多