2016-10-11 11 views
3

私はこの特定の結合を理解しようと数時間を費やしました。私は(すべての必要なインデックスと外部キーを想定して)これらの3つのSQL Serverのテーブルを持っている:SQL Server:NULLの一致を示しながら3つのテーブルを結合する

create table [mykey] (keyname varchar(32) not null); 
go 
create table [myinstance] (
instancename varchar(48) not null); 
go 
create table [mypermissions] (
keyname varchar(32), 
instancename varchar(48), 
permission int not null); 
go 
insert into [mykey] (keyname) values ('test_key_1'), ('test_key_2'), ('test_key_3'); 
GO 
insert into [myinstance] (instancename) values ('sqlexpress'), ('std2008'), ('ent2012'); 
GO 
insert into mypermissions (keyname, instancename, permission) values 
    ('test_key_1', 'sqlexpress', 1), 
    ('test_key_1', 'std2008', 0), 
    ('test_key_2', 'ent2012', 1), 
    ('test_key_2', 'sqlexpress', 0) 
GO 

私は特定の権限が不足しているところも見せながらそれはキー名のためにすべての権限を示して参加を作成しようとしています。私は、出力はこの(順番重要でない)ように見えるしたいと思います:

keyname  instancename permission 
---------- ------------ ---------- 
test_key_1 sqlexpress  1 
test_key_1 std2008  0 
test_key_1 ent2012  NULL 
test_key_2 ent2012  1 
test_key_2 sqlexpress  0 
test_key_2 std2008  NULL 
test_key_3 sqlexpress  NULL 
test_key_3 std2008  NULL 
test_key_3 ent2012  NULL 

ではなく、それは次のようになります。私は運と結合のすべての種類と数時間を費やしている

keyname  instancename permission 
---------- ------------ ---------- 
test_key_1 sqlexpress  1 
test_key_1 std2008  0 
test_key_2 ent2012  1 
test_key_2 sqlexpress  0 
test_key_3 NULL   NULL 

。多分私がしたいことは不可能です。ここで私が試した最新のものされています

select k.keyname, p.instancename, p.permission from mykey k 
    full join mypermissions p on (k.keyname = p.keyname) 
    full join myinstance i on p.instancename = i.instancename 

は、私は可能やろうとしています何ですか?

答えて

6

あなたは第三のテーブルを結合する前に、キー名とINSTANCENAMEのすべての組み合わせを取得するためにCROSS JOINを使用する必要があります。この意志出力

instancename keyname 
------------ ---------- 
sqlexpress  test_key_1 
std2008   test_key_1 
ent2012   test_key_1 
sqlexpress  test_key_2 
std2008   test_key_2 
ent2012   test_key_2 
sqlexpress  test_key_3 
std2008   test_key_3 
ent2012   test_key_3 

このクエリ

SELECT * 
FROM myinstance mi 
CROSS JOIN mykey mk 

を見てあなたは、3番目のテーブルにLEFT JOINを使用すると、以下のクエリに示すように、必要な列を抽出することができます。

SELECT mk.keyname, mi.instancename, mp.permission 
FROM myinstance mi 
CROSS JOIN mykey mk 
LEFT JOIN mypermissions mp ON mk.keyname = mp.keyname AND mi.instancename = mp.instancename 
ORDER BY mk.keyname, mi.instancename 
2

はこのような何かを試してみてください:

select a.keyname, a.instancename, p.permission 
from (select k.keyname, i.instancename from mykey k cross join myinstance i) a 
left join mypermissions p on p.keyname = a.keyname and p.instancename = a.instancename 
+0

あるものここに基づく内部結合? – techspider

+0

これはクロス結合です。最初の表のすべての行に2番目の表のすべての行を乗算します。それを実行して何が生成されているかを確認します。 –

+0

私はこのクエリを実行すると、私はこのエラー '誤った構文の近く ')'。 '' CROSS'キーワードを見逃しましたか? :) – techspider

関連する問題