我最近遇到了一个很久以前为Informix数据库编写的查询。这个查询对我来说似乎有点奇怪和胡说八道。
我知道此查询返回city table
中的所有行以及ocw 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 ;
@@ Impaler是正确的,当结果集只有4列时按5列分组没有多大意义,但我会忽略它。
正如我所看到的,您对OUTER
和UNION 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