我正在进行查询,该查询从表的行中获取数据并将其放在同一列下:
SELECT [t].*,
[d].[Description] AS [Name],
FROM [TrainerClass] AS [t] join [DescriptionTranslation] AS [d] on [t].[Code] = [d].[Code]
WHERE [d].[TableName] = 'TrainerClass' AND
[d].[FieldName] = 'Name' AND
[d].[Language] = 'en-EN';
这很好用,但它返回一列。我想用更多列获得相同的结果,但我无法弄清楚如何使用WHERE语句来完成它。我想实现类似的目标:
SELECT [t].*,
[d].[Description] AS [Name] WHERE [d].[FieldName] = 'Name',
[d].[Description] AS [Info] WHERE [d].[FieldName] = 'Info',
FROM [TrainerClass] AS [t] join [DescriptionTranslation] AS [d] on [t].[Code] = [d].[Code]
WHERE [d].[TableName] = 'TrainerClass' AND
[d].[Language] = 'en-EN';
我知道这不是一个正确的语法,这就是为什么我问你如何得到这个结果。提前谢谢你:)
编辑:
我不想要的东西:
我想要的是什么:
(只用一条记录做的例子,应该有更多)
答案 0 :(得分:4)
您可以使用下面的CASE
语句(我认为这就是您要找的)。请注意,每种情况下不匹配的行都将获得空值,或者您可以将else部分添加到case语句中。
SELECT [t].*,
CASE WHEN [d].[FieldName] = 'Name' THEN [d].[Description] END AS [Name],
CASE WHEN [d].[FieldName] = 'Info' THEN [d].[Description] END AS [Info]
FROM [TrainerClass] AS [t] join [DescriptionTranslation] AS [d]
on [t].[Code] = [d].[Code]
WHERE [d].[TableName] = 'TrainerClass' AND --[d].[FieldName] = 'Name' AND
[d].[Language] = 'en-EN';
<强>更新强>
根据您的更新,要从显示的图片表中获得预期结果,您可以将Max()
功能与Group by
一起使用:
;With cte as
(
--your first query goes here
)
Select Id,Code, Max(Name) Name, Max(info) Info
from cte
Group by Id, Code
你可以不用CTE
作为:
SELECT t.Id, t.Code,
Max(CASE WHEN d.FieldName = 'Name' THEN d.Description END) AS Name,
Max(CASE WHEN d.FieldName = 'Info' THEN d.Description END) AS Info
FROM [TrainerClass] AS t join [DescriptionTranslation] AS d on t.Code = d.Code
WHERE d.TableName = 'TrainerClass' AND --[d].[FieldName] = 'Name' AND
d.Language = 'en-EN'
GROUP BY t.Id, t.Code;
答案 1 :(得分:1)
如果我正确地阅读您的请求,您需要使用不同的过滤器加入表格两次。
select t.*, dName.Description as [Name], dInfo.Description as [Info]
from TrainerClass t
join DescriptionTranslation dName
on t.Code = dName.Code and dName.FieldName = 'Name'
join DescriptionTranslation dInfo
on t.Code = dInfo.Code and dInfo.FieldName = 'Info'
where
dName.TableName = 'TrainerClass' and dName.Language = 'en-EN'
and dInfo.TableName = 'TrainerClass' and dInfo.Language = 'en-EN'
答案 2 :(得分:1)
您可以使用子查询进行查询的另一种方法,它与您的意图非常相似。但是这种方法只有一点需要注意,即如果你有大量的记录集,它可能会很慢。
SELECT [t].*,
( SELECT [d].[Description] FROM [DescriptionTranslation] [d] WHERE [d].[FieldName] = 'Name' and [t].[Code] = [d].[Code] [d].[TableName] = 'TrainerClass' AND
[d].[Language] = 'en-EN') AS [Name],
(SELECT [d].[Description] FROM [DescriptionTranslation] [d] WHERE [d].[FieldName] = 'Info' and [t].[Code] = [d].[Code] [d].[TableName] = 'TrainerClass' AND
[d].[Language] = 'en-EN') AS [Info]
FROM [TrainerClass] AS [t]
答案 3 :(得分:0)
在CROSS APPLY
下面使用您的查询
SELECT [t].*,
[DTNameDescription].[Description] AS [Name]
[DTInfoDescription].[Description] AS [Info]
FROM [TrainerClass] AS [t]
CROSS APPLY (
SELECT [Description]
FROM [DescriptionTranslation] AS [d]
WHERE [t].[Code] = [d].[Code]
AND [d].[FieldName] = 'Name'
) AS DTNameDescription
CROSS APPLY (
SELECT [Description]
FROM [DescriptionTranslation] AS [d]
WHERE [t].[Code] = [d].[Code]
AND [d].[FieldName] = 'Info'
) AS DTInfoDescription
WHERE [d].[TableName] = 'TrainerClass' AND
[d].[Language] = 'en-EN';