Есть ли способ конвертировать UNION ALL
в JOIN
и по-прежнему получать аналогичный результат.Конвертировать UNION ALLs в JOINs
Ниже приведен пример запроса для иллюстрации:
DECLARE @customerIdentifierId BIGINT
SET @customerIdentifierId = 2
SELECT 1 AS Tag, NULL AS Parent, cust.CustomerId AS CustomerId,
NULL AS CustomerIdentifierId, NULL AS OrderDetailId
FROM Customer.CustomerIdentifier custIdent
JOIN Customer.Customer cust
ON cust.CurrentCustomerIdentifierId = custIdent.CustomerIdentifierId
JOIN detail.OrderDetail detail
ON detail.CustomerIdentifierId = custIdent.CustomerIdentifierId
WHERE custIdent.CustomerIdentifierId = @customerIdentifierId
UNION ALL
SELECT 2, 1, NULL, custIdent.CustomerIdentifierId, null
FROM Customer.CustomerIdentifier custIdent
JOIN Customer.Customer cust
ON cust.CurrentCustomerIdentifierId = custIdent.CustomerIdentifierId
JOIN detail.OrderDetail detail
ON detail.CustomerIdentifierId = custIdent.CustomerIdentifierId
WHERE custIdent.CustomerIdentifierId = @customerIdentifierId
UNION ALL
SELECT 3, 1, NULL, null, detail.OrderDetailId
FROM Customer.CustomerIdentifier custIdent
JOIN Customer.Customer cust
ON cust.CurrentCustomerIdentifierId = custIdent.CustomerIdentifierId
JOIN detail.OrderDetail detail
ON detail.CustomerIdentifierId = custIdent.CustomerIdentifierId
WHERE custIdent.CustomerIdentifierId = @customerIdentifierId
Это не так важно, что обнуляет есть нуль в них, но мне нужны отдельные строки, которые дает объединение.
Я попытался сделать CROSS JOIN
, и это не сработало. Я надеюсь, есть некоторые другие SQL
трюк, который может это сделать (CROSS APPLY
?)
В случае это особенно важно, моя конечная цель, чтобы получить эту работу в индексированный (материализованные) вид в SQL Server
.
Это выход Ищу:
Tag Parent CustomerId CustomerIdentifierId OrderDetailId
----------- ----------- -------------------- -------------------- --------------------
1 NULL 4 NULL NULL
1 NULL 4 NULL NULL
1 NULL 4 NULL NULL
1 NULL 4 NULL NULL
1 NULL 4 NULL NULL
2 1 NULL 2 NULL
2 1 NULL 2 NULL
2 1 NULL 2 NULL
2 1 NULL 2 NULL
2 1 NULL 2 NULL
3 2 NULL NULL 2
3 2 NULL NULL 14
3 2 NULL NULL 26
3 2 NULL NULL 38
3 2 NULL NULL 50
Таблицы родитель для многих детей отношений:
1 клиент на многие CustomerIdentifiers 1 CustomerIdentifier для многого OrderDetails
(Это делает дерево)
Вот link на sql, необходимый для создания е таблицы, чтобы сделать мою выше работу запроса:
Можете ли вы разместить структуры таблиц и ожидаемый результат в формате таблицы? – Kangkan
@ Kangkan Я добавил их. – Vaccano
«Есть ли способ конвертировать UNION ALL в JOIN»? Да, это легко. Просто полное внешнее соединение на 1 = 0 и используйте выражение case, чтобы вернуть правильный источник столбца. Но вы все равно не сможете использовать это в индексированном виде ... –