Sql 甲骨文表示,Expression没有一个团队

Sql 甲骨文表示,Expression没有一个团队,sql,oracle,Sql,Oracle,我是甲骨文的新手 我在MySQL中尝试了一个查询,结果很好 select segment1, description, organization_id from apps.mtl_system_items_b where organization_id IN (110 , 268, 448) GROUP BY segment1 HAVING COUNT(DISTINCT organization_id) = 3 但是在Oracle中,它表示不是按表达式分组的。怎么了

我是甲骨文的新手

我在
MySQL
中尝试了一个查询,结果很好

select 
    segment1, description, organization_id
from
    apps.mtl_system_items_b
where
    organization_id IN (110 , 268, 448)
GROUP BY segment1
HAVING COUNT(DISTINCT organization_id) = 3
但是在
Oracle
中,它表示
不是按表达式分组的。怎么了

编辑:-

我想要这样的结果

organisation_id   segment1
110               306145244
268               306145244
448               306145244
110               444444444
268               444444444
448               444444444

很抱歉这么快就回答了

select 
segment1, description, organization_id from
apps.mtl_system_items_b where
organization_id IN (110 , 268, 448) 
GROUP BY segment1, description, organization_id 
HAVING COUNT(DISTINCT organization_id) =3
也许这个解释可以帮助你在分组方面获得一些理解

SQL GROUP BY子句可在SQL SELECT语句中用于跨多个记录收集数据,并按一列或多列对结果进行分组

SQL GROUP BY子句的语法为:

SELECT column1, column2, ... column_n, aggregate_function (expression)
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n;
聚合函数可以是SQL求和函数、SQL计数函数、SQL最小函数或SQL最大函数等函数

由于具有聚合函数,因此需要按显示或选择的每个字段进行分组

请参阅下面的深度解释


您已在
SELECT
列表中解组了未聚合的表达式

MySQL
允许它们(不指定它将返回多少可能的值),但是
Oracle
不允许

根据定义,您的查询将只返回包含3个不同组织的段。那么,您希望返回哪些组织

如果您只想返回段,请使用以下命令:

SELECT  segment1
FROM    apps.mtl_system_items_b
WHERE   organization_id IN (110 , 268, 448)
GROUP BY
        segment1
HAVING  COUNT(DISTINCT organization_id) = 3
SELECT  segment1, description, organization_id
FROM    (
        SELECT  i.*,
                COUNT(DISTINCT organization_id) OVER (PARTITION BY segment1) cnt
        FROM    apps.mtl_system_items_b
        WHERE   organization_id IN (110, 268, 448)
        )
WHERE   cnt = 3
如果您希望所有具有属于三个组织的段的项目,请使用以下选项:

SELECT  segment1
FROM    apps.mtl_system_items_b
WHERE   organization_id IN (110 , 268, 448)
GROUP BY
        segment1
HAVING  COUNT(DISTINCT organization_id) = 3
SELECT  segment1, description, organization_id
FROM    (
        SELECT  i.*,
                COUNT(DISTINCT organization_id) OVER (PARTITION BY segment1) cnt
        FROM    apps.mtl_system_items_b
        WHERE   organization_id IN (110, 268, 448)
        )
WHERE   cnt = 3

以下是查询在MySQL上工作的原因:

Oracle
和任何其他RDBMS中,这将不起作用,因为您需要显式列出groupby子句中所有未聚合的列。要使其工作,请将它们添加到
GROUPBY
子句中

GROUP BY segment1, description, organization_id

请花点时间解释为什么这是一个好答案。您可能知道,但除非您进行解释,否则OP将无法了解。此查询将永远不会返回任何内容。如果您按
组织id
分组,那么
计数(不同的组织id)
如何等于
3
?您可以将关于您的选项的答案发布到@Quassnoi,而不是更正其他人的答案。聪明一点,帮个忙:)谢谢@theTinMan,我已经解释了这个简单的解释,虽然解释很简单,也很简单short@javalovers:当然可以,但是在没有真正理解用户需要什么的情况下编译查询几乎没有什么用处。我想要的是所有3个组织都有的片段。请也给我这个查询。如果段在2个组织或一个组织下,我不想要那个段。。。。在返回结果中,我需要所有3行,我也需要所有3..segment1,description,organization_id@Sahal:哪个
组织\u id
?你有三个。请张贴一些样本数据和所需的输出。我想这样。。。。如果该段在所有3个组织(110268448)中都存在,我将为一个段获取3行。