【问题标题】:SQL find entire row where only 2 columns valuesSQL查找只有2列值的整行
【发布时间】:2013-02-07 11:10:41
【问题描述】:

我正在尝试

select columns Age, Height, House_number, Street
from my_table
where count(combination of House_number, Street)
occurs more than once.

我的桌子是这样的

Age, Height, House_number, Street
15   178     6             Mc Gill Crst 
85   166     6             Mc Gill Crst
85   166     195           Mc Gill Crst
18   151     99            Moon Street 
52   189     14a           Grimm Lane

我想要的结果是这样的

Age, Height, House_number, Street
15   178     6             Mc Gill Crst 
85   166     6             Mc Gill Crst

卡住了!

【问题讨论】:

  • 您使用的是什么RDBMSSQL Server? MySQL? Oracle? DB2?等等。

标签: sql oracle filter group-by


【解决方案1】:

由于您没有提及您正在使用的 RDBMS,因此下面的查询几乎适用于大多数 RDBMS。

SELECT  *
FROM    tableName
WHERE   (House_number, Street) IN
(
    SELECT House_number, STREET
    FROM tableName
    GROUP BY House_number, STREET
    HAVING COUNT(*) >= 2
)

【讨论】:

  • @DaleM ..where only 2 columns values -- 这是我的解释:D
  • 我认为 OP 的意思是 combination of House_number, Street
  • 如果有匹配的house_number 的房子,这将不起作用 -- 参见这个演示 -- sqlfiddle.com/#!2/2e6d4/1。您需要同时检查 house_numberstreet
  • @bluefeet 是的,我搞砸了。但我还是更新了答案。
【解决方案2】:

最好的方法是使用窗口函数,假设您的数据库支持它们:

select columns Age, Height, House_number, Street
from (select t.*, count(*) over (partition by house_number, street) as cnt
      from my_table t
     ) t
where cnt > 1

这是在 Oracle 中使用 Windows 函数(也称为分析函数)。表达式 count(*) over (partition by house_number, street) 正在计算每个 house_number 和街道组合的行数。这有点像group by,但它将计数添加到每一行,而不是将多行合并为一个。

一旦你有了它,就很容易选择值大于 1 的行。

【讨论】:

  • 非常感谢您的快速回复。 Oracle 是我的 RDBMS。问题解决了!我不确定我是否理解“m.*, count(*) over (partition by ID_VALUE, ISSUING_AUTHORITY)”在做什么。如果你有时间,你能解释一下吗?或许可以为我指明一个可以扩展我理解的资源?
【解决方案3】:

听起来你需要一个 NOT DISTINCT。以下内容可能会满足您的需求:Multiple NOT distinct

【讨论】:

    【解决方案4】:

    如果您没有窗口功能,那么您可以使用带有JOIN 的子查询。子查询获取计数大于 1 的 house_numberstreet 的列表,然后使用此结果连接回您的表:

    select t1.age,
      t1.height,
      t1.house_number,
      t1.street
    from my_table t1
    inner join
    (
      select house_number, street
      from my_table 
      group by house_number, street
      having count(*) > 1
    ) t2
      on t1.house_number = t2.house_number
      and t1.street = t2.street
    

    SQL Fiddle with Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多