0

以下の DDL を参照してください。

CREATE TABLE TestTable(id int, [name] varchar(30))
CREATE TABLE TestTable2(id int, [name] varchar(30))

INSERT INTO TestTable (id,[name]) values (1,'')
INSERT INTO TestTable (id,[name]) values (2,'Martin')

INSERT INTO TestTable2 (id,[name]) values (1,null)
INSERT INTO TestTable2 (id,[name]) values (2,'Martin')

select TestTable.* from TestTable
LEFT JOIN TestTable2 
ON TestTable.id=TestTable2.id 
and TestTable.[name]= TestTable2.[Name] and NOT (TestTable.[name] ='' and TestTable2.[name] is null)
where testtable2.id is null

SELECT は 1 行を返しますが、何も返さないと思います。何も返さないと予想する理由は、以下の SQL ステートメントが何も返さないのと同じ理由です。

select TestTable.* from TestTable
LEFT JOIN TestTable2 
ON TestTable.id=TestTable2.id 
and TestTable.[name]= TestTable2.[Name] 
where testtable2.id is null and NOT (TestTable.[name] ='' and TestTable2.[name] is null)

最初の SQL ステートメントが 1 行を返すのはなぜですか? ON 句は、NOT (TestTable.[name] ='' and TestTable2.[name] is null) という条件でこれらのレコードをファイリングする必要があります。返される 1 行には、この基準が含まれています。なんで?

4

1 に答える 1

5

ALEFT JOINは、条件によって除外されない限り、左側のテーブルからすべての行を返しWHEREます。最初のクエリWHERE条件では 1 行が除外WHEREされ、2 番目のクエリでは両方の行が除外されます。

更新: 結合を理解するための一般的なリファレンスは、次のとおりです:
Visual Representation of SQL Joins

ONWHERE結果を制限するために、テーブルを結合する方法を定義するために使用されます。INNER JOINどちらも結果を制限する場合、両者OUTER JOINの違いはかなりのものになります。

于 2013-09-16T16:54:42.970 に答える