Я искал StackOverflow и Google для ответа на эту проблему.
Я пытаюсь создать представление Microsot SQL Server 2008. Не хранимая процедура. Не функция. Просто запрос (то есть представление).
У меня есть три стола. Первая таблица определяет общий ключ, скажем, «CompanyID». В двух других таблицах есть иногда общее поле, скажем, «EmployeeName».
Мне нужен один результат таблицы, который, когда в моем предложении WHERE написано "WHERE CompanyID = 12", выглядит следующим образом:
CompanyID | TableA | TableB
12 | John Doe | John Doe
12 | Betty Sue | NULL
12 | NULL | Billy Bob
Я пробовал ПОЛНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ, которое выглядит так:
SELECT Company.CompanyID,
TableA.EmployeeName,
TableB.EmployeeName
FROM Company
FULL OUTER JOIN TableA ON Company.CompanyID = TableA.CompanyID
FULL OUTER JOIN TableB ON
Company.CompanyID = TableB.CompanyID AND
(TableA.EmployeeName IS NULL OR TableB.EmployeeName IS NULL OR TableB.EmployeeName = TableA.EmployeeName)
Я получаю NULL только из одной сопоставленной таблицы, я не получаю расширения для другой таблицы. В приведенном выше примере я получаю только первый и третий ряды, а не второй.
Может ли кто-нибудь помочь мне создать этот запрос и показать, как это делается правильно?
Кстати, у меня уже есть хранимая процедура, которая выглядит очень чистой и заполняет таблицу в памяти, но это не то, что я хочу.
Спасибо.
- РЕДАКТИРОВАТЬ:
Вот полный пример того, что в настоящее время не работает (отсутствует «кто-то 2» и «кто-то 3».
DECLARE @Company TABLE
(
CompanyID int
)
INSERT INTO @Company (CompanyID) VALUES (10)
INSERT INTO @Company (CompanyID) VALUES (12)
DECLARE @TableA TABLE
(
EmployeeId int,
CompanyId int,
EmployeeName varchar(30)
)
DECLARE @TableB TABLE
(
EmployeeId int,
CompanyId int,
EmployeeName varchar(30)
)
INSERT INTO @TableA ( EmployeeId, CompanyId, EmployeeName )
VALUES ( 1, 10, 'someone' )
--INSERT INTO @TableA ( EmployeeId, CompanyId, EmployeeName )
--VALUES ( 2, 12, 'someone 2' )
INSERT INTO @TableA ( EmployeeId, CompanyId, EmployeeName )
VALUES ( 3, 12, 'someone 3' )
INSERT INTO @TableA ( EmployeeId, CompanyId, EmployeeName )
VALUES ( 3, 12, 'someone 4' )
INSERT INTO @TableB ( EmployeeId, CompanyId, EmployeeName )
VALUES ( 1, 10, 'someone' )
INSERT INTO @TableB ( EmployeeId, CompanyId, EmployeeName )
VALUES ( 2, 12, 'someone 2' )
--INSERT INTO @TableB ( EmployeeId, CompanyId, EmployeeName )
--VALUES ( 3, 12, 'someone 3' )
INSERT INTO @TableB ( EmployeeId, CompanyId, EmployeeName )
VALUES ( 3, 12, 'someone 4' )
SELECT Company.CompanyID,
TableA.EmployeeName,
TableB.EmployeeName
FROM @Company Company
FULL OUTER JOIN @TableA TableA ON Company.CompanyID = TableA.CompanyID
FULL OUTER JOIN @TableB TableB ON Company.CompanyID = TableB.CompanyID
WHERE
(
TableA.EmployeeName IS NULL OR TableB.EmployeeName IS NULL OR
TableB.EmployeeName = TableA.EmployeeName
)
AND Company.CompanyID = 12
Результат:
CompanyID EmployeeName EmployeeName
12 someone 4 someone 4
Что я хочу:
CompanyID EmployeeName EmployeeName
12 NULL someone 2
12 someone 3 NULL
12 someone 4 someone 4