【发布时间】:2014-12-12 10:07:54
【问题描述】:
我有一个场景有不同的语言记录,我需要在单独的行中获取所有数据,如果某些数据不是所需的语言,那么下一个默认语言会进入该记录的操作,依此类推。
declare @LanguageId int = 3
select * from Purpose where LanguageId=(CASE WHEN @LanguageId = 1 THEN CASE WHEN EXISTS
(SELECT PurposeId
FROM Purpose
WHERE LanguageId = @LanguageId) THEN @LanguageId WHEN EXISTS
(SELECT PurposeId
FROM Purpose
WHERE LanguageId = 2) THEN 2 ELSE 3 END WHEN @LanguageId = 2 THEN CASE WHEN EXISTS
(SELECT PurposeId
FROM Purpose
WHERE LanguageId = @LanguageId) THEN @LanguageId WHEN EXISTS
(SELECT PurposeId
FROM Purpose
WHERE LanguageId = 1) THEN 1 ELSE 3 END WHEN @LanguageId = 3 THEN CASE WHEN EXISTS
(SELECT PurposeId
FROM Purpose
WHERE LanguageId = @LanguageId) THEN @LanguageId WHEN EXISTS
(SELECT PurposeId
FROM Purpose
WHERE LanguageId = 2) THEN 2 ELSE 1 END END)
我已经进行了查询并且工作正常,我正在寻找一个替代的优化查询。欢迎任何帮助或建议。
【问题讨论】:
-
什么定义了“next”默认 LanguageId?
-
也许像
SELECT ... FROM ... GROUP BY PurposeId HAVING LanguageId = MIN( LanguageId )这样的东西会起作用。这为每个 PurposeId 提供一条记录,其中包含该 PurposeId 最低的 LanguageId。 -
“下一个默认语言”是指语言的优先级。例如Lang1 在 Lang2 和 Lang3 之前,Lang2 在 Lang3 之前,依此类推..
-
我是这么认为的。试试上面的 group by。
-
嗯,你的建议很好,但正如我所说,需要语言。假设用户想查看 Lang3 中的数据,而数据仅在 Lang2 中可用,那么我们需要先在 Lang3 中查看,然后在 Lang1 中查看,然后在 Lang2 中查看。所以那里有很多回溯。
标签: sql sql-server performance optimization