Sql server SELECT语句中的SQL WHERE语句
我正在进行一个查询,该查询从表的行中获取数据并将其放在同一列下:Sql server SELECT语句中的SQL WHERE语句,sql-server,tsql,select,where,Sql Server,Tsql,Select,Where,我正在进行一个查询,该查询从表的行中获取数据并将其放在同一列下: 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] = 'Nam
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';
我知道这不是一个正确的语法,这就是为什么我问你如何得到这个结果。提前感谢:)
编辑:
我不想要的是:
我想要的是:
(仅使用一条记录制作的示例,应该有更多)如果我正确地阅读了您的请求,您需要使用不同的筛选器加入表两次
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'
您可以使用下面这样的
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()
函数与分组依据一起使用
:
;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;
另一种方法是使用子查询进行查询,这与您的意图非常相似。但是这种方法只有一个警告,那就是如果你有大的记录集,它会非常慢
使用下面的
交叉应用
进行查询
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';
我觉得它看起来不错,但不幸的是它没有返回任何数据。不过,没有语法错误…请尝试执行
左连接
,而不是只执行连接
(默认情况下为内部连接)。看看这是否给了您任何提示,说明为什么没有得到匹配。我希望具有相同代码的列的值位于同一行上。有什么简单的方法吗?不知道你说的是什么意思。如果你提供一个提琴,并用预期的结果更新你的问题,它将很容易理解和解决。在这里,你可以查看我以前的答案:希望它有帮助。我也在用预期的结果更新问题。更新了,你能检查一下吗?这段代码是到目前为止我发现的最好的代码,但很糟糕,它不能正常工作。我已经更新了如何从你不想要的东西中得到你想要的东西。
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';