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';