一种带过滤的交叉连接查询



我有以下三个表:

<>之前dbo。产品Id |名称1 | p12 | p2dbo。ProductTranslationsId | LangId | Text1 | 1 |文本|1 | 2 | Text_DE2 | 1 | OtherText_ENdbo。语言Id |文化1 | en-US2 | de-DE3丨es-ES之前

我需要这样的查询:

<>之前select *从ProductTranslations pt(一些连接)语言的语言之前

生产:对于产品1:

<>之前1 |简体中文版1 | de-DE | Text_DE1 | es-ES | null之前

对于产品2:

<>之前2 | en-US | OtherText_EN2 | de-DE | null2 | es-ES | null之前

理想情况下,我想有一个视图,我可以使用Id过滤。

我明白了。您需要所有语言的行,即使没有匹配的翻译。

您可以使用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;
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

在产品和语言之间使用笛卡尔连接来获得它们的所有可能组合,然后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

最新更新