2

テーブルの行からデータを取得して同じ列に配置するクエリを作成しています。

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

それが適切な構文ではないことはわかっています。そのため、この結果を取得する方法を尋ねています。前もって感謝します :)

編集:

私が望まないもの:

いいえ

私が欲しいもの:

はい

(1 つのレコードのみで作成された例。もっとあるはずです)

4

4 に答える 4

4

以下のようなステートメントを使用できCASEます(それがあなたが探しているものだと思います)。各ケースで行が一致しないと null 値になるか、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;
于 2013-10-03T17:08:25.770 に答える
1

クエリにサブクエリを使用できる別の方法であり、意図に非常に似ています。ただし、この方法には 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] 
于 2013-10-03T19:37:43.193 に答える