[英]Need help fixing the syntax for this LEFT OUTER JOIN
I have a database structure like so: 我有这样的数据库结构:
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
I want to display all resource key names and resource values, ie string values against each key, for, say, the French (France) culture, ie the culture with the ShortName
fr-FR but even if a key does not have a value in the culture, it must display the key name but NULL for the value. 我想显示所有资源键名称和资源值,即针对每个键的字符串值,例如, 法国(法国)文化,即具有
ShortName
fr-FR但即使键中没有值的文化文化,它必须显示键名,但值显示为NULL。 Like so: 像这样:
Name ResourceValue
-------------------------------------------------------
Hello Bonjour
HowAreYou Comment allez-vous?
ThisKeyHasUSEnglishValueOnly NULL
It seems like a simple LEFT OUTER JOIN application to me, but my code isn't working. 对我来说,这似乎是一个简单的LEFT OUTER JOIN应用程序,但是我的代码无法正常工作。 Could someone please help correct my code?
有人可以帮忙更正我的代码吗?
My query is: 我的查询是:
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';
Somehow, the last join in the above-query turns out to become an inner join, eliminating those rows where there is no value in the said culture. 不知何故,上述查询中的最后一个联接变成了内部联接,从而消除了在所述区域性中没有值的那些行。
SELECT a.name, b.ResourceValue
FROM ResourceKey a
LEFT JOIN
(
SELECT b.ResourceKeyID, b.ResourceValue
FROM Strings b
INNER JOIN Culture c
ON b.CultureID = c.ID
WHERE c.shortname = 'fr-FR'
) b ON a.ID = b.ResourceKeyId
UPDATED 更新
USE SSTOBMAY; 使用SSTOBMAY;
SELECT a.name, b.ResourceValue
FROM ResourceKey a
LEFT JOIN
(
SELECT b.ResourceKeyID, b.ResourceValue
FROM Strings b
INNER JOIN Culture c
ON b.CultureID = c.ID
WHERE c.shortname = 'fr-FR'
) b ON a.ID = b.ResourceKeyId
INNER JOIN
StringCategory sc ON
sc.ResourceKeyId = a.Id
INNER JOIN Category c ON c.Id = sc.CategoryId
WHERE c.Name = 'JavaScript';
LEFT JOINS can become inner joins when you specify criteria on the outer joined table . 在外部联接表上指定条件时,LEFT JOINS可以成为内部联接。 Try using a Left join to a subquery of culture containing your where clause instead of left joining to Culture.
尝试对包含您的子句的文化子查询使用左联接,而不是对文化进行左联接。
LEFT JOIN (SELECT Id ,resourcevalue
FROM Culture
WHERE shortname = 'fr-FR') as CULTURE
ON
Strings.CultureId = Culture.Id AND Culture.Id
Full query 完整查询
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';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.