外部和联合都在同一张桌子上?

问题描述 投票:1回答:1

我最近遇到了一个很久以前为Informix数据库编写的查询。这个查询对我来说似乎有点奇怪和胡说八道。

我知道此查询返回city table中的所有行以及ocw table中匹配的行。如果city中没有ocw table的记录,则返回该code column值的city has a NULL

我也知道UNION会删除重复项,而UNION ALL不会删除重复项。

我对outerunion 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 ;
sql database informix outer-join union-all
1个回答
2
投票

@@ Impaler是正确的,当结果集只有4列时按5列分组没有多大意义,但我会忽略它。

正如我所看到的,您对OUTERUNION ALL的理解是正确的。目的似乎是要生成一个堆叠的结果集,其中包含与ocw相连的2个城市版本,1个具有实际animalId的城市和1个animalid = 0的城市。

我对自己使用的OUTER不熟悉(我总是将其与LEFT/RIGHT/FULL一起使用,但是会假定默认值为LEFT OUTER

如果ocw表中未显示城市记录,则该城市的返回代码列的值为NULL。

那是正确的,但是行WHERE c.mutual = o.code将使该点变得不重要。您可以将联接重写为LEFT JOIN ocw o ON c.mutual = o.code

GROUP BY可能在过去已经针对某个不再存在的聚合列进行了处理……也许是第5列?

我认为可以重做为:

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
© www.soinside.com 2019 - 2024. All rights reserved.