【问题标题】:How to have 'distinct' in having clause如何在有子句中有“不同”
【发布时间】:2015-04-10 07:27:31
【问题描述】:

编辑:这是一个示例关系!我需要它来处理更大的关系,所以没有解决方法!

所以我得到了一个简单的任务,一开始我没有看到什么可能是错误的,现在我只是不明白为什么它不起作用。

假设我有一个人及其朋友的表格,我想选择有 2 个或更多朋友的人。

------------------------------
|person  | friend | relation |
|-----------------------------
|ana     | jon    | friend   |
|ana     | jon    | lover    |
|ana     | phillip| friend   |
|ana     | kiki   | friend   |
|mary    | jannet | friend   |
|mary    | jannet | lover    |
|peter   | july   | friend   |

我想做一个

 SELECT person FROM people GROUP BY person HAVING count(distinct friend) > 1;

得到

-------
| ana |
-------

但在 HAVING 子句中使用“distinct”时出现语法错误。 我知道“distinct”是投影条款的一部分,但是 如何使“count”只计算不同的条目而无需额外的子查询或其他东西?

编辑:我能想到的最好的方法是:

SELECT tmp.person FROM (SELECT person, count(distinct friend) 
             AS numfriends FROM people GROUP BY person) AS tmp 
       WHERE tmp.numfriends > 1;

【问题讨论】:

  • Mysql 还是 sqlserver ?
  • 嗯,它是 ibm informix 但我认为它在任何 sql db 中都是一样的

标签: sql informix


【解决方案1】:

来自文档

http://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_0162.htm

HAVING 子句中的条件不能包含 DISTINCT 或 UNIQUE 聚合表达式。

一种解决方法是让选择中的计数不同

SELECT 
person,
count(distinct friend) as f_count
FROM people 
GROUP BY person 
HAVING f_count > 1;

更新:

查看文档,发现事实

在 SELECT 之前评估 HAVING 子句 - 所以服务器 还不知道那个别名。

所以为了实现目标,可以这样做

select
person,
f_count
from(
 SELECT 
 person,
 count(distinct friend) as f_count
 FROM people
 GROUP BY person 
)x
where f_count > 1 

【讨论】:

  • 嗯。它说在查询的任何表中都找不到 f_count
  • 这很有趣..我正在查看文档,但没有提到上述案例。理想情况下,将在选择完成后评估是否拥有。可能是它不支持。但它没有在任何地方提及。
  • 在计算新关系的条目之前是否可以过滤?
  • 也许是的,这就是它没有识别别名的原因。尝试在having子句中使用count(*)。
【解决方案2】:

你需要这样写

SELECT person
FROM people
WHERE relation = 'friend'
GROUP BY person 
HAVING count(*) > 1;

【讨论】:

    【解决方案3】:

    检查一下。

    declare @t table(person varchar(50),  Friend VARCHAR(50), relation VARCHAR(50))
    
    INSERT INTO @T VALUES('ana', 'jon','friend')
    ,('ana', 'jon','lover')
    ,('ana', 'phillip','friend')
    ,('ana', 'kiki','friend')
    ,('mary', 'jannat','friend')
    ,('mary', 'jannat','lover')
    
    
    SELECT DISTINCT PERSON FROM 
    (
        SELECT person FROM @t GROUP BY person HAVING count(friend) > 1
    ) a
    

    【讨论】:

      【解决方案4】:

      通过使用更多 group by 只是另一种方式 -

      select cust_xref_id
      from(
      select cust_xref_id,cm11
      from temp_nippon_cust
      group by cust_xref_id,cm11
      ) temp
      group by cust_xref_id
      having count(cm11) > 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-24
        • 2021-03-14
        • 1970-01-01
        • 2016-05-02
        • 2017-05-20
        • 1970-01-01
        • 2017-03-20
        相关资源
        最近更新 更多