SELECT语句中的SQL WHERE语句

时间:2013-10-03 16:47:22

标签: 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] = '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';

我知道这不是一个正确的语法,这就是为什么我问你如何得到这个结果。提前谢谢你:)

编辑:

我不想要的东西:

No

我想要的是什么:

Yes

(只用一条记录做的例子,应该有更多)

4 个答案:

答案 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';
相关问题