2

次のようなデータベース構造があります。

SELECT * FROM Culture;
------------------------
Id  ShortName   FullName                Supported
22  en-US       English (United States) 1
23  fr-FR       French (France)         1
24  hi-IN       Hindi (India)           0

SELECT * FROM ResourceKey;
----------------------------
Id      Name
20572   HowAreYou
20571   Hello
20573   ThisKeyHasUSEnglishValueOnly

SELECT * FROM Strings;
-----------------------
Id      CultureId   ResourceKeyId           ResourceValue
41133   22          20571                   Hello
41134   22          20572                   How are you?
41135   23          20571                   Bonjour
41136   23          20572                   Comment allez-vous?
41137   22          20573                   This key has US English value only.    


SELECT * FROM Category;
------------------------
Id  Name
1   JavaScript


SELECT * FROM StringCategory;
------------------------------
Id  ResourceKeyId   CategoryId
1   20571           1
2   20572           1
3   20573           1

すべてのリソース キー名とリソース値、つまり各キーに対する文字列値を表示したい。たとえば、フランス語 (フランス)カルチャ、つまりShortName fr-FRのカルチャの場合でも、キーに値が含まれていない場合でも文化、それはキー名を表示する必要がありますが、値は NULL です。そのようです:

Name                            ResourceValue
-------------------------------------------------------
Hello                           Bonjour
HowAreYou                       Comment allez-vous?
ThisKeyHasUSEnglishValueOnly    NULL

私には単純な LEFT OUTER JOIN アプリケーションのように思えますが、私のコードは機能していません。誰かが私のコードを修正するのを手伝ってくれませんか?

私のクエリは次のとおりです。

SELECT ResourceKey.Name AS Name, ResourceValue
FROM
ResourceKey LEFT OUTER JOIN Strings
ON
Strings.ResourceKeyId = ResourceKey.Id
INNER JOIN StringCategory
ON
StringCategory.ResourceKeyId = Strings.ResourceKeyId
INNER JOIN Category
ON
StringCategory.CategoryId = Category.Id
LEFT OUTER JOIN Culture
ON
Strings.CultureId = Culture.Id AND Culture.Id = (SELECT Id FROM Culture WHERE ShortName = 'fr-FR')
AND
Category.Name = 'JavaScript';

どういうわけか、上記のクエリの最後の結合は内部結合になり、上記のカルチャに値がない行が削除されます。

4

2 に答える 2

0

外部結合テーブルに条件を指定すると、LEFT JOINS が内部結合になる場合があります。Culture への左結合ではなく、where 句を含む Culture のサブクエリへの Left 結合を使用してみてください。

LEFT JOIN (SELECT Id ,resourcevalue 
FROM Culture 
WHERE shortname = 'fr-FR') as CULTURE
ON 
Strings.CultureId = Culture.Id AND Culture.Id 

完全なクエリ

SELECT ResourceKey.Name AS Name, ResourceValue
FROM
ResourceKey LEFT OUTER JOIN Strings
ON
Strings.ResourceKeyId = ResourceKey.Id
INNER JOIN StringCategory
ON
StringCategory.ResourceKeyId = Strings.ResourceKeyId
INNER JOIN Category
ON
StringCategory.CategoryId = Category.Id
 LEFT JOIN (SELECT Id ,resourcevalue 
    FROM Culture 
    WHERE shortname = 'fr-FR') as CULTURE
    ON 
    Strings.CultureId = Culture.Id 
WHERE Category.Name = 'JavaScript';
于 2013-09-26T11:54:47.590 に答える