1

「非順次」オン式を使用した 2 つの右外部結合に関する、非常に単純でありながら興味深いクエリを理解する上で問題があります。クエリは次のとおりです。

select * from C 
right outer join A on A.F1 = C.F1 
right outer join B on B.F1 = C.F1;

ここにテーブルがあります:

create table A ( F1 varchar(200)); 
create table B ( F1 varchar(200)); 
create table C ( F1 varchar(200));

ここにいくつかの行があります:

insert into A values ('A'); 
insert into A values ('B');
insert into A values ('C');
insert into B values ('B'); 
insert into B values ('C');
insert into B values ('D');
insert into C values ('A'); 
insert into C values ('C'); 
insert into C values ('D');

注: クエリselect * from C right outer join A on A.F1 = C.F1 right outer join B on B.F1 = C.F1; 結合式は両方ともテーブル C を参照します。

クエリは (列の次に行) を返します

(NULL,NULL, B),(C, C, C).(NULL, **NULL**, D)

そして私は(SQLについての私のほとんどの理解では)期待していました

(NULL,NULL, B),(C, C, C),(NULL, **D**, D)

SQL (Microsoft SQL と MySQL でテスト済み) がこれらの値に到達する論理シーケンスは何ですか。

私の「実行」シーケンスでは、テーブル A で A、null (B の場合)、C、null (D の場合) の値を使用し、テーブル B では、「製品」の前に null (A の場合)、B、C、D の値を使用します。 C (B,C,D) と合併します。

Gawie PS: MySQL と Microsoft SQL 2008 を使用してこれをテストしましたが、結果は同じでした。

4

4 に答える 4

1

テーブル「A」には結合するD値がないため、期待するDの代わりにNULLが返されます。列エイリアスを介して値がどのテーブルから取得されているかを特定すると、簡単に確認できます。

SELECT c.f1 AS c, a.f1 AS a, b.f1 AS b 
  FROM c 
RIGHT JOIN A on A.F1 = C.F1 
RIGHT JOIN B on B.F1 = C.F1
于 2010-07-14T21:47:10.807 に答える
0

テーブル A にはフィールド 'D' が含まれていないため、D が結果セットの 2 番目の列である Gawie に表示されることはありません。結果セットのフィールドは、C.F1、A.F1、B.F1 になります (テーブルが結合に表示される順序と同じです)。

于 2010-07-14T21:46:43.847 に答える
0

右結合は、表示される順序で (左から右に) 評価されますfrom C

C        -->  (A), (C), (D)

次にright join A、次のように参加しA.F1 = C.F1ます。

C, A     -->  (A, A), (NULL, B), (C, C)

次にright join B(結合がオンであるため、最初の列に一致しますB.F1 = C.F1):

C, A, B  -->  (NULL, NULL, B), (C, C, C), (NULL, NULL, D)

したがってfrom C right join A、最初の列に D が含まれていないため、right join Bは照合に失敗し、C と A のD列、および B の列に NULL を含む行を追加します。

于 2010-07-14T21:46:44.757 に答える
0

C, A --> (A, A), (NULL, B), (C, C)

次に、右結合 B (結合が B.F1 = C.F1 にあるため、最初の列に一致します):

C、A、B --> (NULL、NULL、B)、(C、C、C)、(NULL、NULL、D)

ここで迷ってしまいます…

C、A、B が (NULL、B、B) などと等しくないのはなぜですか?

for C, A for column B equals (NULL, B) right outer join (NULL, B) with B should yield (NULL, B, B)... マッチングが逆でない限り! C, A, B --> (NULL, B, B) (これは明らかに間違っています - 理由が完全にはわかりません)

于 2010-07-15T09:54:44.467 に答える