一种带过滤的交叉连接查询
Kind of cross join query with filtering
我有以下三个表:
dbo.Product
编号 |姓名
1 | P1
2 | P2
dbo.Product翻译
编号 |语言编号 |文本
1 | 1 | Text_EN
1 | 2 | Text_DE
2 | 1 |其他Text_EN
dbo.Language
编号 |文化
1 |英文
2 |去DE
3 | es-ES
我需要这样的查询:
select *
来自 ProductTranslations pt (some join) Language lang
生产:
对于产品 1:
1 | zh-CN | Text_EN
1 |去德 | Text_DE
1 | es-ES |无效的
对于产品 2:
2 | zh-CN |其他Text_EN
2 |去德 |无效的
2 | es-ES |无效的
理想情况下,我希望有一个可以使用 Id 进行过滤的视图。
任何帮助将不胜感激。
SELECT
p.Id
,p.Name
,l.Id as LangId
,l.Culture
,t.Text
FROM
dbo.Product p
CROSS JOIN dbo.Language l
LEFT JOIN dbo.ProductTransalations t
ON p.Id = t.Id
AND l.Id = t.LangId
在产品和语言之间使用 Cartesian Join 获取它们的所有可能组合,然后 LEFT JOIN ProductTranslations。
这是一个完整的工作示例
DECLARE @Product AS TABLE (Id INT, Name CHAR(2))
DECLARE @ProductTransalations AS TABLE (Id INT, LangId INT, Text VARCHAR(50))
DECLARE @Language AS TABLE (Id INT, Culture VARCHAR(20))
INSERT INTO @Product VALUES (1,'P1'),(2,'P2')
INSERT INTO @ProductTransalations VALUES (1,1,'Text_EN'),(1,2,'Text_DE'),(2,1,'OtherText_EN')
INSERT INTO @Language VALUES (1,'en-US'),(2,'de-DE'),(3,'es-ES')
SELECT
p.Id
,p.Name
,l.Id as LangId
,l.Culture
,t.Text
FROM
@Product p
CROSS JOIN @Language l
LEFT JOIN @ProductTransalations t
ON p.Id = t.Id
AND l.Id = t.LangId
我明白了。您需要所有语言的行,即使没有匹配的翻译。
您可以使用 left join
:
select p.productId, l.culture, pt.text
from (select 1 as productId) p cross join
language l left join
ProductTranslations pt
on pt.id = p.productId and pt.langid = l.id;
您可以将“1”更改为您喜欢的任何产品。
如果您更喜欢使用 where
子句,您可以这样做:
select p.productId, l.culture, pt.text
from product p cross join
language l left join
ProductTranslations pt
on pt.id = p.productId and pt.langid = l.id
where p.id = 1;
我有以下三个表:
dbo.Product 编号 |姓名 1 | P1 2 | P2 dbo.Product翻译 编号 |语言编号 |文本 1 | 1 | Text_EN 1 | 2 | Text_DE 2 | 1 |其他Text_EN dbo.Language 编号 |文化 1 |英文 2 |去DE 3 | es-ES
我需要这样的查询:
select * 来自 ProductTranslations pt (some join) Language lang
生产: 对于产品 1:
1 | zh-CN | Text_EN 1 |去德 | Text_DE 1 | es-ES |无效的
对于产品 2:
2 | zh-CN |其他Text_EN 2 |去德 |无效的 2 | es-ES |无效的
理想情况下,我希望有一个可以使用 Id 进行过滤的视图。 任何帮助将不胜感激。
SELECT
p.Id
,p.Name
,l.Id as LangId
,l.Culture
,t.Text
FROM
dbo.Product p
CROSS JOIN dbo.Language l
LEFT JOIN dbo.ProductTransalations t
ON p.Id = t.Id
AND l.Id = t.LangId
在产品和语言之间使用 Cartesian Join 获取它们的所有可能组合,然后 LEFT JOIN ProductTranslations。
这是一个完整的工作示例
DECLARE @Product AS TABLE (Id INT, Name CHAR(2))
DECLARE @ProductTransalations AS TABLE (Id INT, LangId INT, Text VARCHAR(50))
DECLARE @Language AS TABLE (Id INT, Culture VARCHAR(20))
INSERT INTO @Product VALUES (1,'P1'),(2,'P2')
INSERT INTO @ProductTransalations VALUES (1,1,'Text_EN'),(1,2,'Text_DE'),(2,1,'OtherText_EN')
INSERT INTO @Language VALUES (1,'en-US'),(2,'de-DE'),(3,'es-ES')
SELECT
p.Id
,p.Name
,l.Id as LangId
,l.Culture
,t.Text
FROM
@Product p
CROSS JOIN @Language l
LEFT JOIN @ProductTransalations t
ON p.Id = t.Id
AND l.Id = t.LangId
我明白了。您需要所有语言的行,即使没有匹配的翻译。
您可以使用 left join
:
select p.productId, l.culture, pt.text
from (select 1 as productId) p cross join
language l left join
ProductTranslations pt
on pt.id = p.productId and pt.langid = l.id;
您可以将“1”更改为您喜欢的任何产品。
如果您更喜欢使用 where
子句,您可以这样做:
select p.productId, l.culture, pt.text
from product p cross join
language l left join
ProductTranslations pt
on pt.id = p.productId and pt.langid = l.id
where p.id = 1;