outer和union都在同一个表上?

bnl4lu3b  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(342)

我最近遇到了一个很早以前就为informix数据库编写的查询。这个问题在我看来有点奇怪和无稽之谈。
我知道这个查询返回 city tableocw table . 如果没有记录 city 出现在 ocw table ,返回 code column 为了这个 city has a NULL 价值观。
我也明白 UNION 删除重复项,而 UNION ALL 没有。
我的理解是 outer 以及 union all 对的?
有人能解释一下他们用这个查询想要达到什么目的吗?有没有更好的方法?

SELECT * FROM city as c, OUTER ocw o
WHERE c.mutual = o.code
INTO temp city_ocw;

SELECT
      name   ,
      year   ,
      mutual ,
      0 animalId 
FROM
      city_ocw
WHERE
      code IS NULL
GROUP BY
      1, 2, 3 , 4

UNION ALL

SELECT
      name   ,
      year   ,
      mutual ,
      animalId 
FROM
      city_ocw
WHERE
     NOT code IS NULL
GROUP BY
      1, 2, 3 , 4 
INTO TEMP city_ocw_final ;
h7wcgrx3

h7wcgrx31#

@我是对的,当结果集只有4列时,按5列进行分组没有多大意义,但我将忽略这一点。
在我看来,你对 OUTER 以及 UNION ALL 是正确的。目标似乎是生成一个叠加结果集,其中2个版本的city加入了ocw,1个版本具有实际的animalid,1个版本的animalid=0。
我不熟悉 OUTER 被自己使用(我总是和它一起使用) LEFT/RIGHT/FULL ),但会假定默认为 LEFT OUTER .
如果ocw表中没有某个城市的记录,则该城市的返回代码列具有空值。
那是真的,但是 WHERE c.mutual = o.code 这就不重要了。你可以把连接重写为 LEFT JOIN ocw o ON c.mutual = o.code 这个 GROUP BY 可能是过去对某个不再存在的聚合列执行的操作。。。也许是第五栏?
我认为可以重做为:

SELECT name,
    year,
    mutual,
    0 as animalId
FROM city c
    LEFT JOIN ocw o ON c.mutual = o.code
UNION --don't need the all since animalId ensures rows are different
SELECT name,
    year,
    mutual,
    animalId
FROM city c
    LEFT JOIN ocw o ON c.mutual = o.code

相关问题