条件SQL查询列映射

条件SQL查询列映射,sql,sql-server,database,join,Sql,Sql Server,Database,Join,我有两个数据库表-类别和本地化类别。Categories表具有默认语言中所有类别的Name和Description列。LocalizedCategories表还包含这些列,这些列包含这些列到其他语言的翻译(每个内容语言都有其id,因此表的主键由ContentLanguageId和CategoryId)组成)。我现在想执行一个SELECT查询来获取所有类别,以便在给定类别和内容语言的翻译可用的情况下本地化结果中的文本数据。如果翻译不可用,或者内容语言是默认语言,我想回到Categories表中的默

我有两个数据库表-
类别
本地化类别
Categories
表具有默认语言中所有类别的
Name
Description
列。
LocalizedCategories
表还包含这些列,这些列包含这些列到其他语言的翻译(每个内容语言都有其id,因此表的主键由
ContentLanguageId
CategoryId
)组成)。我现在想执行一个SELECT查询来获取所有类别,以便在给定类别和内容语言的翻译可用的情况下本地化结果中的文本数据。如果翻译不可用,或者内容语言是默认语言,我想回到
Categories
表中的默认语言


这样的查询会是什么样子?是否有更好的方法来分隔表,以便更简单地查询和处理数据?

数据库模式正常。将类别默认值和翻译后的类别与语言表一起使用。 所以你有1->lang n->cat转换到->n cat

您应该查询数据库,以便:

SELECT * FROM Categories INNER JOIN LocalizedCategories USING (Category_id) WHERE ContentLanguageId=?
如果给定的语言没有到Category_id的翻译,这将返回0行。
在您的服务器语言中,您可以完成这些操作并实现其背后的逻辑,如果给定的查询没有返回任何数据,请查询默认表并用它们填充显示的数据。

数据库模式正常。将类别默认值和翻译后的类别与语言表一起使用。 所以你有1->lang n->cat转换到->n cat

您应该查询数据库,以便:

SELECT * FROM Categories INNER JOIN LocalizedCategories USING (Category_id) WHERE ContentLanguageId=?
如果给定的语言没有到Category_id的翻译,这将返回0行。
在您的服务器语言中,您可以完成这些操作并实现其背后的逻辑,如果给定的查询没有返回任何数据,请查询默认表并用它们填充显示的数据。

简单,只需执行左联接:

select Description = coalesce(lc.Description, c.Description )
     , Name        = coalesce(lc.Name, c.Name)
     , Lang        = coalesce(lc.Lang, DefaultContentLanguageId )
from Categories c 
left join LocalizedCategories lc on c.CategoryId=lc.CategoryId and lc.ContentLanguageId = ? 

很简单,只需执行左连接:

select Description = coalesce(lc.Description, c.Description )
     , Name        = coalesce(lc.Name, c.Name)
     , Lang        = coalesce(lc.Lang, DefaultContentLanguageId )
from Categories c 
left join LocalizedCategories lc on c.CategoryId=lc.CategoryId and lc.ContentLanguageId = ? 

你的桌子设计看起来不错。要仅在数据存在时获取数据,请使用外部联接来完成。然后使用COALESCE获得一个值或另一个值

select 
  coalesce(lc.name, c.name),
  coalesce(lc.description, c.description)
from categories c
left outer join localizedcategories lc 
  on lc.categoryid = c.categoryid and lc.contentlanguageid = 'EN';

你的桌子设计看起来不错。要仅在数据存在时获取数据,请使用外部联接来完成。然后使用COALESCE获得一个值或另一个值

select 
  coalesce(lc.name, c.name),
  coalesce(lc.description, c.description)
from categories c
left outer join localizedcategories lc 
  on lc.categoryid = c.categoryid and lc.contentlanguageid = 'EN';

您使用的是哪种数据库管理系统?博士后?Oracle?主要是Microsoft SQL Server如何确定本地化时选择哪种语言?使用哪种DBMS?博士后?Oracle?主要是Microsoft SQL Server如何确定本地化时选择哪种语言?