【问题标题】:Two SELECT-Statement work alone but not together两个 SELECT 语句单独工作但不能一起工作
【发布时间】:2018-07-26 02:06:00
【问题描述】:

我有两个单独工作的 select 语句,但不能一起工作。

这个:

SELECT MAX(a2.Fachanzahl)
FROM C17_AbfrageBView a2;

工作并返回一行一列,值为 2

这个:

SELECT a1.PersonID, a1.Vorname, a1.Nachname, MAX(a1.Fachanzahl) Fachanzahl
FROM C17_AbfrageBView a1
GROUP BY a1.PersonID, a1.Vorname, a1.Nachname
HAVING MAX(a1.Fachanzahl) = 2;

工作并返回正确的行。

但是,这个:

SELECT a1.PersonID, a1.Vorname, a1.Nachname, MAX(a1.Fachanzahl) Fachanzahl
FROM C17_AbfrageBView a1
GROUP BY a1.PersonID, a1.Vorname, a1.Nachname
HAVING MAX(a1.Fachanzahl) = (
                              SELECT MAX(a2.Fachanzahl)
                              FROM C17_AbfrageBView a2
                            );

不返回任何内容(它应该返回与上述语句相同的行),即使外部和内部选择语句各自工作。这里有什么问题?

谢谢!

【问题讨论】:

  • 如果您更改查询返回什么:select * from (SELECT a1.PersonID, a1.Vorname, a1.Nachname, MAX(a1.Fachanzahl) Fachanzahl FROM C17_AbfrageBView a1 GROUP BY a1.PersonID, a1.Vorname, a1.Nachname) t where t.Fachanzahl = ( SELECT MAX(a2.Fachanzahl) FROM C17_AbfrageBView a2 );
  • @l3rutt 行得通!谢谢!
  • 这段代码在同一个实例中执行?另外,如果您将最大值存储到变量中并使用该变量仍然返回错误的输出?
  • @Petra1999 但是我们没有找到您的代码不起作用的原因。
  • @Petra1999 这应该可以工作:dbfiddle.uk/… Fachanzahl 数据类型是什么?

标签: sql oracle select subquery sql-subselect


【解决方案1】:

我想不出会发生这种情况的机制。据我所知,MAX() 不会更改列的类型,排除浮点舍入错误或排序规则不兼容等问题。

可以说如果使用WHERE而不是HAVING编写查询会更有效率:

SELECT DISTINCT a1.PersonID, a1.Vorname, a1.Nachname, a1.Fachanzahl
FROM C17_AbfrageBView a1
WHERE a1.Fachanzahl = (SELECT MAX(a2.Fachanzahl)
                       FROM C17_AbfrageBView a2
                      );

如果MAX() 引入了一些对值进行细微更改的问题,那么这可能会解决问题。

因为您只关心最大值(至少在问题中的查询中),您可以先过滤。这使得查询更加高效。 SELECT DISTINCTGROUP BY 之间的区别应该在没有和可以忽略不计之间。前者更容易打字。

【讨论】:

  • 我唯一的猜测是原始代码由于语句的执行顺序而失败。如果子查询在评估 HAVING 子句时没有值,它将给出 OP 看到的 NULL 结果。
  • @ChristianPalmer 。 . . Oracle 应该是事务安全的,因此对数据的更改不应影响查询。
  • 我不是指数据更改——只是两个语句的执行顺序。很明显,数据库应该首先评估子查询,但可能是因为一个错误,它没有这样做
  • @ChristianPalmer 。 . .那应该没什么区别。最大值就是最大值——我相信这是非常确定的。该最大值应该在某个组中。类型不应更改。应该可以使用=找到组。
  • 好吧 - 我不是想说应该发生什么 - 当然这个声明(无论多么笨拙)应该有效。我正在推测可能导致此问题的错误类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
相关资源
最近更新 更多