我正在尝试为Rails应用程序实现单列区域化,并且我遇到了一些具有复杂SQL需求的主要问题。对于此系统,区域可以用国家代码(例如us
)表示大写的大陆代码(例如NA
),或者可以NULL
表示“默认”信息。我需要通过一些相关信息(例如外键)对这些项目进行分组(我们称之为external_id
)。
鉴于某个国家及其大陆,我需要能够仅选择最具体的区域。因此,如果记录与国家代码一起存在,我选择它们。如果,我不想要带有大陆代码的记录。如果不是这样,我想要一个NULL
代码的记录,这样我就可以收到默认值。
到目前为止,我已经认为我可以使用生成的CASE
语句来获取任意排序顺序。像这样:
SELECT *, CASE region
WHEN 'us' THEN 1
WHEN 'NA' THEN 2
ELSE 3
END AS region_sort
FROM my_table
WHERE region IN ('us','NA') OR region IS NULL
GROUP BY external_id
ORDER BY region_sort
问题在于,如果没有聚合函数,GROUP BY
为给定行返回的实际数据似乎不可用。如何按下此查询以使其仅返回region_sort
有序群组的第一条记录?
答案 0 :(得分:0)
只有第一条记录或只有第一条组的记录?你写的是否有不止一条记录,甚至都不清楚。
在任何情况下,似乎您都在向后弯曲以在一个查询中执行此操作,但数据库结构未针对此进行优化。如果只有3个等级并且您想要最具体的,为什么不只是:
SELECT * FROM my_table WHERE region = 'us' GROUP BY external_id
如果返回了某些内容,请停止,否则有条件地运行1或2个查询。
我可能错了,但我的直觉说会产生更好的整体表现,不过我认为这取决于你的数据库的细节。