Перекрестное соединение с последующим левым соединением - PullRequest
1 голос
/ 12 июля 2010

Можно ли сделать CROSS JOIN между 2 таблицами, затем LEFT JOIN в 3-й таблице, а затем, возможно, больше левых соединений?Я использую SQL Server 2000 / 2005.

Я выполняю следующий запрос, который довольно прост IMO, но я получаю ошибку.

select  P.PeriodID,
        P.PeriodQuarter,
        P.PeriodYear,
        M.Name,
        M.AuditTypeId,
        A.AuditId
from Period P, Member M

LEFT JOIN Audits A 
ON P.PeriodId = A.PeriodId

WHERE 
    P.PeriodID > 29 AND P.PeriodID < 38
    AND M.AuditTypeId in (1,2,3,4)
order by M.Name

Я получаю следующую ошибку:

Сообщение 4104, уровень 16, состояние 1, строка 1 Не удалось связать идентификатор из нескольких частей «P.PeriodId».

Если удалить ЛЕВУЮПРИСОЕДИНЯЙТЕСЬ, запрос работает.Тем не менее, мне нужно LEFT JOIN, так как есть еще информация, которую мне нужно извлечь из других таблиц.

Что я делаю не так?Есть ли лучший способ для этого?

Ответы [ 2 ]

5 голосов
/ 12 июля 2010

вы забыли CROSS JOIN в вашем запросе:

select  P.PeriodID,
        P.PeriodQuarter,
        P.PeriodYear,
        M.Name,
        M.AuditTypeId,
        A.AuditId
from Period P CROSS JOIN Member M

LEFT JOIN Audits A 
ON P.PeriodId = A.PeriodId

WHERE 
    P.PeriodID > 29 AND P.PeriodID < 38
    AND M.AuditTypeId in (1,2,3,4)
order by M.Name
1 голос
/ 12 июля 2010

Нельзя объединять неявные и явные объединения - см. Этот пример выполнения .

CROSS JOIN должны использоваться в системе настолько редко, что я бы хотел, чтобы все были явными, чтобы гарантировать, что это явно не ошибка кодирования или ошибка проектирования.

Если вы хотите сделать неявное левое внешнее объединение, сделайте это (не поддерживается в SQL Azure):

select  P.PeriodID,
        P.PeriodQuarter,
        P.PeriodYear,
        M.Name,
        M.AuditTypeId,
        A.AuditId
from #Period P, #Member M, #Audits A 
WHERE 
    P.PeriodID > 29 AND P.PeriodID < 38
    AND M.AuditTypeId in (1,2,3,4)
    AND P.PeriodId *= A.PeriodId
order by M.Name​
...