Ваш вопрос не очень ясен, но я думаю, что мой магический хрустальный шар дал мне хорошее предположение:
Я думаю, что вы ищете LEFT JOIN
и CROSS JOIN
:
- В следующий раз, пожалуйста, создайте автономный образец, подобный этому
- Я создаю 3 фиктивных таблицы с образцами данных
DECLARE @tblStatus TABLE(ID INT IDENTITY,StatusName VARCHAR(100));
INSERT INTO @tblStatus VALUES('Status 1')
,('Status 2')
,('Status 3')
,('Status 4')
,('Status 5');
DECLARE @tblGroup TABLE(ID INT IDENTITY,GroupName VARCHAR(100));
INSERT INTO @tblGroup VALUES ('Group 1')
,('Group 2')
,('Group 3')
,('Group 4')
,('Group 5');
DECLARE @tblProduct TABLE(ID INT IDENTITY,ProductName VARCHAR(100),StatusID INT, GroupID INT);
INSERT INTO @tblProduct VALUES ('Product 1, Status 1, Group 2',1,2)
,('Product 2, Status 1, Group 3',1,3)
,('Product 3, Status 3, Group 4',3,4)
,('Product 4, Status 3, Group 3',3,3)
,('Product 5, Status 1, Group 5',1,5);
- Возвращает каждый статус (независимо от значений продукта) вместе с продуктами (если есть соответствующая строка)
SELECT s.StatusName
,p.*
FROM @tblStatus s
LEFT JOIN @tblProduct p ON s.ID=p.StatusID
- Сначала будет использоваться CROSS JOIN
для создания декартового произведения каждый с каждым.
- LEFT JOIN
работает как указано выше
SELECT s.StatusName
,g.GroupName
,p.*
FROM @tblStatus s
CROSS JOIN @tblGroup g
LEFT JOIN @tblProduct p ON s.ID=p.StatusID AND g.ID=p.GroupID;
Если это не то, что вам нужно, попробуйте настроить пример, подобный моему, и укажите ожидаемый результат.