LEFT JOIN работает не так как я ожидал

Необходима помощь со скриптом. Есть таблица Request c полем Request.uf_field, в котором может быть указан как udv.id так и NULL. Запрос считает все заявки с заполненным или пустым Request.uf_field, но мне так же необходимо чтобы в столбце udv_name указывались и те значения udv.name, которые не были перечислены в Request.uf_field. По такому условию udv.userdirectory_id = 6007. Разные варианты пробовал, но все пальцем в небо. Спасибо за помощь.

Таблица Request Таблица udv Ожидаемый результат

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 шт):

Автор решения: Pronnik

Не совсем понял, но вроде вам нужно что-то вроде этого

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 в вашем коде

→ Ссылка
Автор решения: Yitzhak Khabinsky

Попробуйте следующее решение.

Оно использует 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 |
+---------+--------------+
→ Ссылка