結果很奇怪,包含源自INNER JOIN
的行和來自源和目標表(例如{SC,TC},{SC,TD},{SC,TE},{ SD,TC},{SD,TD},{SD,TE})。
請看下面的例子:
DECLARE @Source TABLE (SomeId INT NULL, Name VARCHAR(10) NOT NULL);
DECLARE @Target TABLE (SomeId INT NULL, Name VARCHAR(10) NOT NULL);
INSERT @Source VALUES (1,'S-A'),(2,'S-B'),(NULL,'S-C'),(NULL,'S-D');
INSERT @Target VALUES (1,'T-A'),(2,'T-B'),(NULL,'T-C'),(NULL,'T-D'),(NULL,'T-E'),(6,'T-F');
SELECT s.*, t.*
FROM @Source s
INNER JOIN @Target t ON s.SomeId = t.SomeId OR s.SomeId IS NULL AND t.SomeId IS NULL;
SELECT s.*, t.*
FROM @Source s
INNER JOIN @Target t ON ISNULL(s.SomeId,-9999) = ISNULL(t.SomeId,-9999);
結果:
SomeId Name SomeId Name
----------- ---------- ----------- ----------
1 S-A 1 T-A <- INNER JOIN
2 S-B 2 T-B <- INNER JOIN
NULL S-C NULL T-C <- "CROSS JOIN"
NULL S-C NULL T-D <- "CROSS JOIN"
NULL S-C NULL T-E <- "CROSS JOIN"
NULL S-D NULL T-C <- "CROSS JOIN"
NULL S-D NULL T-D <- "CROSS JOIN"
NULL S-D NULL T-E <- "CROSS JOIN"
第二個條件(檢查雙方都不爲空)似乎是多餘的;一個空值不會比較等於一個不是。 –
這就是Linq2Sql在執行'Object.Equals(target.SomeId,source.SomeId)時產生的' – Magnus
不夠公平,但我敢打賭它會被優化掉。 –