Как вложить несколько левых соединений и подзапросов в SQL

Как я могу одновременно вложить два подзапроса и два левых соединения? В настоящее время у меня есть мой запрос (query1), как показано ниже, который отлично работает. Но он включает в себя подключение двух внешних запросов, которые должны обновляться отдельно по дате данных.

Я хочу расширить query1, применив подзапрос (query2) для практики, а также обновить все в одном скрипте.

ПРИМЕЧАНИЕ. Запрос написан в MS Access.

Любая помощь высоко ценится!

SELECT DISTINCT 
Acct.AccountNumber
, Acct.ABCat AS Cat
, Acct.fName AS FirstName
, Acct.lName AS LastName
, Acct.Age AS Age
, o.Type, o.OFirstLoginDate
, o.OLastLoginDate
, m.Type
, m.LstDepDate AS LastDepDate
FROM 
table1 AS Acct 
LEFT JOIN 
        OB_table AS o 
        ON Acct.AccountNumber = o.AccountNumber

LEFT JOIN 
        MB_table AS m 
        ON Acct.AccountNumber = m.AccountNumber
WHERE 
Acct.Cat IN (9,12,16,17)
AND Acct.DataDate = 20200430 
AND Acct.Status = 'Open';

Query2 с использованием подзапросов и левого соединения. Я получаю сообщение об ошибке

Syntax error (missing operator) in query expression 'Acct.AccountNumber = o.AccountNumber    
LEFT JOIN 
(SELECT DISTINCT 
ParentAccount AS AccountNumber
,TYPE
,LstDepDate AS LastDepDate
FROM MBtable
WHERE ProcessDate = 20200430
SELECT DISTINCT 
Acct.AccountNumber
, Acct.ABCat AS Cat
, Acct.fName AS FirstName
, Acct.lName AS LastName
, Acct.Age AS Age
, o.Type, o.OFirstLoginDate
, o.OLastLoginDate
, m.Type
, m.LstDepDate AS LastDepDate
FROM 
table1 AS Acct 
LEFT JOIN 
(
SELECT DISTINCT 
Online.Account AS AccountNumber
, Online.TYPE
, Online.OBFLDate AS OFirstLoginDate
, Online.OBLLDate AS OLastLoginDate
FROM OBtable AS Online
WHERE Online.DataDate=20200430 
And Online.OBFLDate Is Not Null
)
AS o 
ON Acct.AccountNumber = o.AccountNumber
LEFT JOIN
(
SELECT DISTINCT 
ParentAccount AS AccountNumber
, TYPE
, LstDepDate AS LastDepDate
FROM MBtable
WHERE ProcessDate = 20200430 
AND FDate IS NOT NULL
ORDER BY LDate DESC
) 
AS m 
ON Acct.AccountNumber = m.AccountNumber
WHERE Acct.Cat IN (9,12,16,17)
 AND Acct.DataDate=20200430 
AND Acct.Status = 'Open';

person Cherrycoke    schedule 31.05.2020    source источник
comment
Может быть, не единственная проблема (так что просто комментарий), но мне пришло в голову, что вы не можете иметь ORDER BY внутри этого второго подзапроса. В противном случае вам нужно быть более конкретным в том, что не так, а что не работает.   -  person Joel Coehoorn    schedule 31.05.2020
comment
Также вместо WHERE Acct.Cat=9 OR ... OR ... можно сказать WHERE Acct.Cat IN (9,12,16,17)   -  person Joel Coehoorn    schedule 31.05.2020


Ответы (1)


Вы не даете подробностей о значении «не работает». Тем не менее, я думаю, что ваш случай может быть хорошим кандидатом на использование «внешнего применения», если вы используете MS SQL Server. Пример из реальной жизни, когда использовать OUTER/CROSS ПРИМЕНИТЬ в SQL

person Máté Gábor    schedule 31.05.2020