私はこの特定の結合を理解しようと数時間を費やしました。私は(すべての必要なインデックスと外部キーを想定して)これらの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
は、私は可能やろうとしています何ですか?
あるものここに基づく内部結合? – techspider
これはクロス結合です。最初の表のすべての行に2番目の表のすべての行を乗算します。それを実行して何が生成されているかを確認します。 –
私はこのクエリを実行すると、私はこのエラー '誤った構文の近く ')'。 '' CROSS'キーワードを見逃しましたか? :) – techspider