【问题标题】:using oracle when join two subqueries together changed the contents of the first query将两个子查询连接在一起时使用 oracle 更改了第一个查询的内容
【发布时间】:2017-10-15 21:03:10
【问题描述】:

当我尝试将两个子查询连接在一起时,第一个查询中的值发生了变化。知道为什么吗?谢谢!

代码如下:

SELECT *
FROM    ((

     SELECT HOME, VISITOR, COUNT("result") AS HGOALS
     FROM(
         SELECT HOME, VISITOR, "result"
         FROM ENGLAND
         WHERE TIER = 1 AND "SEASON" >= 1980 AND "result" = 'H'
         )
     GROUP BY HOME, VISITOR
     ORDER BY HGOALS DESC)
             JOIN
     (SELECT HOME, VISITOR, COUNT("result") AS AGOALS
     FROM(
         SELECT HOME, VISITOR, "result"
         FROM ENGLAND
         WHERE TIER = 1 AND "SEASON" > 1980 AND "result" = 'A'
         )
     GROUP BY HOME, VISITOR) USING (VISITOR, HOME))
     ORDER BY AGOALS DESC;

输出的部分是

     Manchester United  Aston Villa 5   18
     Arsenal    West Ham United 5   17
     Arsenal    Aston Villa 6   17
     Manchester United  Everton 12  16
     Liverpool  Aston Villa 8   16

但是当我只执行 JOIN 的第一部分,即

     SELECT HOME, VISITOR, COUNT("result") AS HGOALS
     FROM(
         SELECT HOME, VISITOR, "result"
         FROM ENGLAND
         WHERE TIER = 1 AND "SEASON" >= 1980 AND "result" = 'H'
         )
     GROUP BY HOME, VISITOR
     ORDER BY HGOALS DESC

结果部分是:

     Manchester United  Tottenham Hotspur   27
     Arsenal    Everton 26
     Manchester United  Aston Villa 26
     Liverpool  Tottenham Hotspur   25
     Manchester United  West Ham United 24

注意,对于

     Manchester United  Aston Villa 5   18
     Manchester United  Aston Villa 26

我应该得到的结果是 26,但是当我将两个子查询连接在一起时它变成了 5。 为什么?

【问题讨论】:

  • 感谢 Ella Guan。我不明白为什么第一个子查询中的count 可以通过加入第二个子查询来改变,因为每个countjoin 之前内联执行。如果可能,您能否发布支持数据(曼联主场对阵阿斯顿维拉)?您还可以运行以下变体查询并让我知道这场比赛的结果吗? SELECT HOME, VISITOR, COUNT(DECODE(RESULT,'H',RESULT,NULL)) AS HGOALS, COUNT(DECODE(RESULT,'A',RESULT,NULL)) AS AGOALS FROM ENGLAND WHERE TIER = 1 AND SEASON >= 1980 GROUP BY VISITOR, HOME; 还有为什么'H' >= 1980 而'A' >= 1980?
  • 抱歉后台数据太长,无法放入评论区。基本上有26次曼彻斯特队作为主队击败阿斯顿维拉队。我运行这个: SELECT HOME,VISITOR,COUNT(DECODE("result",'H',"result",NULL)) AS HGOALS, COUNT(DECODE("result",'A',"result",NULL) ) 作为来自英格兰的进球,其中 TIER = 1 且赛季 >= 1980 且主场 = 'Manchester United' 且访客 = 'Aston Villa' GROUP BY by VISITOR, HOME;结果是:曼联阿斯顿维拉 26 2。实际上我不知道为什么,但是当我将 > 1980 用于 'A' 而不是 >= 1980 时,我只能得到与给定答案相匹配的结果。

标签: sql oracle dbeaver


【解决方案1】:

我的问题太复杂了。这不是你想要的吗?

SELECT HOME, VISITOR,
       SUM(CASE WHEN result = 'H' THEN 1 ELSE 0 END) as HGOALS,
       SUM(CASE WHEN result = 'A' THEN 1 ELSE 0 END) as AGOALS
FROM ENGLAND
WHERE TIER = 1 AND SEASON >= 1980 
GROUP BY HOME, VISITOR
ORDER BY AGOALS DESC;

注意:您可能需要 result 周围的引号,具体取决于列的定义方式。

【讨论】:

  • 谢谢!我尝试了您的查询,但在 HGOALS 上仍然得到“5”而不是“26”。
  • 我怀疑问题是对数据的误解。显然,原始查询中的 join 不是问题。
  • 我会仔细检查。谢谢!
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2011-09-04
相关资源
最近更新 更多