假设我有以下2个表:
Table1: Table2:
Col1: Col2: Col3: Col1: Col2: Col4:
a b c a b d
e <null> f e <null> g
h i j h i k
l <null> m l <null> n
o <null> p o <null> q
Run Code Online (Sandbox Code Playgroud)
现在,我想加入这些表上Col1,并Col2带回整套的样子:
Result:
Col1: Col2: Col3: Col4:
a b c d
e <null> f g
h i j k
l <null> m n
o <null> p q
Run Code Online (Sandbox Code Playgroud)
所以,我尝试了一个SQL:
SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN Table2
ON Table1.Col1 = Table2.Col1
AND Table1.Col2 = Table2.Col2
Run Code Online (Sandbox Code Playgroud)
但它不匹配的NULL值Col2,所以我最终得到:
Result:
Col1: Col2: Col3: Col4:
a b c d
h i j k
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到我想要的结果?
谢谢!
Gor*_*off 81
您可以明确关于连接:
SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN
Table2
ON (Table1.Col1 = Table2.Col1 or Table1.Col1 is NULL and Table2.Col1 is NULL) AND
(Table1.Col2 = Table2.Col2 or Table1.Col2 is NULL and Table2.Col2 is NULL)
Run Code Online (Sandbox Code Playgroud)
在实践中,我更有可能coalesce()在连接条件中使用:
SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN
Table2
ON (coalesce(Table1.Col1, '') = coalesce(Table2.Col1, '')) AND
(coalesce(Table1.Col2, '') = coalesce(Table2.Col2, ''))
Run Code Online (Sandbox Code Playgroud)
哪个''值不在任何一个表中.
只是提醒一句.在大多数数据库中,使用任何这些构造都会阻止使用索引.
小智 29
使用Left Outer Join而不是Inner Join来包含具有NULLS的行.
SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 LEFT OUTER JOIN
Table2 ON Table1.Col1 = Table2.Col1
AND Table1.Col2 = Table2.Col2
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此处:http://technet.microsoft.com/en-us/library/ms190409(v = sql.105).aspx
sge*_*des 17
尝试使用ISNULL功能:
SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1
INNER JOIN Table2
ON Table1.Col1 = Table2.Col1
AND ISNULL(Table1.Col2, 'ZZZZ') = ISNULL(Table2.Col2,'ZZZZ')
Run Code Online (Sandbox Code Playgroud)
凡'ZZZZ'在表中从未有的任意值.
肮脏而快速的黑客攻击:
SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN Table2 ON Table1.Col1 = Table2.Col1
AND ((Table1.Col2 = Table2.Col2) OR (Table1.Col2 IS NULL AND Table2.Col2 IS NULL))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
116282 次 |
| 最近记录: |