Я думаю, что у вас уже есть свой ответ, но концептуально, здесь есть несколько вопросов, которые нужно решить, и я подумал, что приведу несколько примеров, использующих данные, немного похожие на ваши, но значительно упрощенные.
CREATE TABLE #STKA (V6PART INT, OTHER_DATA VARCHAR(50));
CREATE TABLE #METHDM (AQPART INT, KIT_ID INT, SOME_DATE DATETIME, OTHER_DATA VARCHAR(50));
CREATE TABLE #SERI (HTPART INT, OTHER_DATA VARCHAR(50));
CREATE TABLE #OCRI (DDPART INT, OTHER_DATA VARCHAR(50));
INSERT INTO #STKA SELECT 1, NULL UNION ALL SELECT 2, NULL UNION ALL SELECT 3, NULL; --1, 2, 3 Ids
INSERT INTO #METHDM SELECT 1, 1, '20200108 10:00', NULL UNION ALL SELECT 1, 2, '20200108 11:00', NULL UNION ALL SELECT 2, 1, '20200108 13:00', NULL; --1 Id appears twice, 2 Id once, no 3 Id
INSERT INTO #SERI SELECT 1, NULL UNION ALL SELECT 3, NULL; --1 and 3 Ids
INSERT INTO #OCRI SELECT 1, NULL UNION ALL SELECT 4, NULL; --1 and 4 Ids
Итак, по сути, у нас есть несколько проблем:
o первая проблема заключается в том, что идентификаторы в таблицах различаются, одна таблица имеет идентификатор # 4, но ее нет ни в одной из другие; o вторая проблема состоит в том, что у нас есть несколько строк для одного и того же идентификатора в одной таблице; o третья проблема заключается в том, что в некоторых таблицах «отсутствуют» идентификаторы, которые есть в других таблицах, которые вы уже рассмотрели с помощью LEFT JOIN, поэтому я проигнорирую это.
--This will select ID 1 twice, 2 once, 3 once, and miss 4 completely
SELECT
*
FROM
#STKA
LEFT JOIN #METHDM ON #METHDM.AQPART = #STKA.V6PART
LEFT JOIN #SERI ON #SERI.HTPART = #STKA.V6PART
LEFT JOIN #OCRI ON #OCRI.DDPART = #STKA.V6PART;
Итак, проблема в том, что мы не все идентификаторы в нашей «якорной» таблице STKA, и на самом деле нет ни одной таблицы, в которой есть все идентификаторы. Теперь ваши данные могут быть в порядке, но если это не так, вы можете просто добавить шаг, чтобы найти каждый идентификатор, и использовать его в качестве привязки.
--This will select each ID, but still doubles up on ID 1
WITH Ids AS (
SELECT V6PART AS ID FROM #STKA
UNION
SELECT AQPART AS ID FROM #METHDM
UNION
SELECT HTPART AS ID FROM #SERI
UNION
SELECT DDPART AS ID FROM #OCRI)
SELECT
*
FROM
Ids I
LEFT JOIN #STKA ON #STKA.V6PART = I.Id
LEFT JOIN #METHDM ON #METHDM.AQPART = I.Id
LEFT JOIN #SERI ON #SERI.HTPART = I.Id
LEFT JOIN #OCRI ON #OCRI.DDPART = I.Id;
Это использует выражение общей таблицы, но подзапрос также сделает работу. Однако это все еще оставляет нас с проблемой, когда идентификатор 1 появляется дважды в списке, потому что он имеет несколько строк в одной из вложенных таблиц.
Один из способов исправить это - выбрать строку с самой последней дата или любой другой ЗАКАЗ, который вы можете применить к данным:
--Pick the best row for the table where it has multiple rows, now we get one row per ID
WITH Ids AS (
SELECT V6PART AS ID FROM #STKA
UNION
SELECT AQPART AS ID FROM #METHDM
UNION
SELECT HTPART AS ID FROM #SERI
UNION
SELECT DDPART AS ID FROM #OCRI),
BestMETHDM AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY AQPART ORDER BY SOME_DATE DESC) AS ORDER_ID
FROM
#METHDM)
SELECT
*
FROM
Ids I
LEFT JOIN #STKA ON #STKA.V6PART = I.Id
LEFT JOIN BestMETHDM ON BestMETHDM.AQPART = I.Id AND BestMETHDM.ORDER_ID = 1
LEFT JOIN #SERI ON #SERI.HTPART = I.Id
LEFT JOIN #OCRI ON #OCRI.DDPART = I.Id;
Конечно, вы также можете добавить некоторую агрегацию (SUM, MAX, MIN, AVG и др. c.) для решения этой проблемы ( если это действительно проблема). Кроме того, я использовал выражение для общей таблицы, но это также сработало бы с подзапросом.