【问题标题】:How do I implement fallback language concept in SQL如何在 SQL 中实现后备语言概念
【发布时间】: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


【解决方案1】:

这可能对你有用:

SELECT
p1.PurposeId, MIN( ISNULL( p2.LanguageId, p1.LanguageId ) ) AS LanguageId
FROM Purpose p1
LEFT OUTER JOIN Purpose p2 on p1.PurposeId = p2.PurposeId AND p2.LanguageId = :desiredLanguage
GROUP BY p1.PurposeId

如果有条目,则产生 desiredLanguage,否则为每个 PurposeId 提供最低的可用 LanguageId。

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 2017-05-06
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2014-07-15
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多