LEFT JOIN работает не так как я ожидал
Необходима помощь со скриптом. Есть таблица Request c полем Request.uf_field, в котором может быть указан как udv.id так и NULL. Запрос считает все заявки с заполненным или пустым Request.uf_field, но мне так же необходимо чтобы в столбце udv_name указывались и те значения udv.name, которые не были перечислены в Request.uf_field. По такому условию udv.userdirectory_id = 6007. Разные варианты пробовал, но все пальцем в небо. Спасибо за помощь.
SELECT
ISNULL(udv.name, '(empty)') AS udv_name,
COUNT (Request.id) AS request_count
FROM
Request
LEFT JOIN udv
ON Request.uf_field = udv.id
GROUP BY
udv.name
ORDER BY
udv.name
Ответы (2 шт):
Не совсем понял, но вроде вам нужно что-то вроде этого
SELECT
udv.name AS udv_name,
COUNT(request.id) AS request_count
FROM request
LEFT JOIN udv ON request.uf_field = udv.id
GROUP BY udv.name
UNION
SELECT
udv.name AS udv_name,
COUNT(request.id) AS request_count
FROM request
RIGHT JOIN udv ON request.uf_field = udv.id
GROUP BY udv.name
ORDER BY udv_name
Если добавить во вторую таблицу поле Null, можно будет обойтись без объединения и просто заменить на Right Join в вашем коде
Попробуйте следующее решение.
Оно использует FULL OUTER JOIN.
SQL
-- DDL and sample data population, start
DECLARE @Request TABLE (ID INT IDENTITY PRIMARY KEY, uf_field INT);
INSERT INTO @Request (uf_field) VALUES
(504),(504),
(NULL), (502),
(507), (504),
(502), (NULL),
(504), (505);
DECLARE @Udv TABLE (ID INT, [Name] VARCHAR(10));
INSERT INTO @Udv (ID, [Name]) VALUES
(501, 'foo'),
(502, 'bar'),
(503, 'tro'),
(504, 'lolo'),
(505, 'para'),
(506, 'pa'),
(507, 'pam'),
(508, 'cpp');
-- DDL and sample data population, end
;WITH rs AS
(
SELECT r.uf_field
, u.[Name]
FROM @Udv AS u
FULL OUTER JOIN @Request AS r ON r.uf_field = u.ID
)
SELECT COALESCE([Name], '(empty)') AS [Name]
, COUNT(IIF(rs.name IS NULL, 1, uf_field)) AS RequestCount
FROM rs
GROUP BY [Name];
Результат
+---------+--------------+
| Name | RequestCount |
+---------+--------------+
| (empty) | 2 |
| bar | 2 |
| cpp | 0 |
| foo | 0 |
| lolo | 4 |
| pa | 0 |
| pam | 1 |
| para | 1 |
| tro | 0 |
+---------+--------------+


