2016-11-02 2 views
0

я следующие три таблицы:Вид перекрестного соединения запрос с фильтрацией

 
dbo.Product 
Id | Name 
1 | P1 
2 | P2 

dbo.ProductTranslations 
Id | LangId | Text 
1 | 1   | Text_EN 
1 | 2   | Text_DE 
2 | 1   | OtherText_EN 

dbo.Language 
Id | Culture 
1 | en-US 
2 | de-DE 
3 | es-ES 

мне нужен запрос как:

 
select * 
from ProductTranslations pt (some join) Language lang 

Для получения: для продукта 1:

 
1 | en-US  | Text_EN 
1 | de-DE  | Text_DE 
1 | es-ES  | null 

для продукта 2:

 
2 | en-US  | OtherText_EN 
2 | de-DE  | null 
2 | es-ES  | null 

В идеале я хотел бы иметь представление о том, что я могу фильтровать при использовании Id. Любая помощь будет оценена по достоинству.

+0

Подсказка: 'JOIN' должно быть достаточно. –

ответ

0

я вижу. Вам нужны строки для всех языков, даже если нет соответствующего перевода.

Вы можете сделать это с 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; 
0
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