私はこの問題への答えを求めてStackOverflowとGoogleを精査しました。
Microsot SQLServer2008ビューを作成しようとしています。ストアドプロシージャではありません。関数ではありません。単なるクエリ(つまりビュー)。
私は3つのテーブルを持っています。最初のテーブルは、「CompanyID」などの共通キーを定義します。他の2つのテーブルには、「EmployeeName」などの一般的なフィールドがあります。
WHERE句に「WHERECompanyID=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)
一致した1つのテーブルからのみNULLを取得していますが、他のテーブルの展開は取得していません。上記のサンプルでは、基本的に1行目と3行目のみを取得しており、2行目は取得していません。
誰かが私がこのクエリを作成するのを手伝って、これがどのように正しく行われるかを教えてもらえますか?
ところで、私はすでに非常にきれいに見え、メモリ内のテーブルにデータを入力するストアドプロシージャを持っていますが、それは私が望んでいることではありません。
ありがとう。
- 編集:
これは、現在機能していないものの完全なサンプルです(「誰か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