これはちょっと混乱するかもしれませんが、うまくいけば誰かが私を助けてくれます。何らかの理由で私の心が空白になってしまい、問題をタイプすることが助けになるかもしれません。不足しているレコードを含むT-SQLクエリ
私はいくつかのETLのものをやっていますし、特定のId
値でグループ化できるデータがあります。私のデータセットの各レコードはLookupId
の値を持ち、別のテーブルに参加して追加情報を得るために使用します。かなり標準INNER JOIN
ものはここにあります。しかし、私はまた、私のデータセットに欠損値LookupId
を含める必要があります。これは私のINNER JOIN
をLEFT JOIN
に変換します。これはかなり標準的なものです。
あなたは私が何を探しています何のアイデアを取得するには、以下の次のサンプルスキーマとデータを使用することができます。
-- Create sample schema
CREATE TABLE ETL_DataSet (
Id INT NOT NULL,
LookupId INT NULL,
LookupCode CHAR(1) NULL,
LookupDesc NVARCHAR(40) NULL
);
CREATE TABLE ETL_LookupTable (
LookupId INT NOT NULL
, LookupCode CHAR(1) NOT NULL
, LookupDesc NVARCHAR(40) NOT NULL
, CONSTRAINT PK_LookupTable_LookupId PRIMARY KEY CLUSTERED (LookupId)
);
-- Insert sampel data
INSERT INTO ETL_LookupTable (LookupId, LookupCode, LookupDesc) VALUES
(1, 'Z', 'Z Description'),
(2, 'A', 'A Description'),
(3, 'B', 'B Description'),
(4, 'C', 'C Description'),
(5, 'D', 'D Description'),
(6, 'E', 'E Description'),
(7, 'X', 'X Description');
INSERT INTO ETL_DataSet (Id, LookupId, LookupCode, LookupDesc) VALUES
(1, 3, 'B', 'B Description'),
(1, 5, 'D', 'D Description'),
(1, 3, 'B', 'B Description'),
(1, 2, 'A', 'A Description'),
(2, 4, 'C', 'C Description'),
(2, 6, 'E', 'E Description'),
(2, 3, 'B', 'B Description'),
(2, 2, 'A', 'A Description');
そしてここでは、実行するサンプルスクリプトです:
DECLARE @id INT = 1; //change this to 1 or 2
;WITH LookupCTE AS
(
SELECT d.*
FROM ETL_LookupTable l INNER JOIN ETL_DataSet d ON l.LookupId = d.LookupId
WHERE d.Id = @id --comment this out to get all data in ETL_DataSet
)
SELECT *
FROM ETL_LookupTable l LEFT JOIN LookupCTE cte ON l.LookupId = cte.LookupId
最終的な目標は、IDのセットにLookupTable値がない場合でも、各Id
のすべてのLookupTable値を含めることです。 @Id
を1と2の間で変更すると、これが動作することがわかりますが、CTEのWHERE
句をコメントアウトすると、間違ったデータが取得されます。カーソルや他の行単位の技法を使わずにこれをやろうとしているので、誰かが私を正しい方向にアシストしたりポイントしたりすることができれば幸いです。
望ましい結果は次のようになります。
Id LookupId LookupCode LookupDesc
----------- ----------- ---------- ----------------------------------------
1 2 A A Description
1 3 B B Description
1 3 B B Description
1 NULL C C Description
1 5 D D Description
1 NULL E E Description
1 NULL X X Description
1 NULL Z Z Description
2 2 A A Description
2 3 B B Description
2 4 C C Description
2 NULL D D Description
2 6 E E Description
2 NULL X X Description
2 NULL Z Z Description
あなたは "期待結果" を提供することができますしてください –
@Used_By_Already Nolan Shangさんの希望する出力をご覧ください。NULL行にはまだ他のデータが添付されていますが、最初の列には欠落しているデータも含まれています。 – fujiiface
*私の期待している結果のために、他の誰かが結果を見て、それはほとんど十分です。*真剣に?あなたは本当の期待された結果であることを示すことを気にすることはできませんか? –