从两个不同的表中获取空值的值?
我有一个大表(主)像这样从两个不同的表中获取空值的值?
person_id fee ref_id <otherfields>
1 foo 23
1 bar null
1 abc 23
2 xyz 34
许多用于REF_ID值都为空,我需要找回。顺便说一句,我需要选择,而不是更新。 我有两个其他表d1,d2包含必要的缺少ref_id(以及不同的字段),他们可以使用person_id引用。 person_id可能不存在于其中一个表中(例如,它可能不在d1中,但它在d2中)
我可以使用其中一个表填充一些ref_id,但是如何使用其他表来检索剩余的空值的值?联盟听起来适合我?但是我挣扎着,因为它给了我比我原来更多的行,这是不对的。
SQL Server 2008的
编辑:D1,D2具有相同(为person_id,REF_ID)元组
你想加入,你可能想使用COALESCE
,如:
SELECT person_id, fee,
COALESCE (m.ref_id, d1.ref_id, d2.ref_id) as 'ref_id',
...
FROM table t
LEFT JOIN d1
ON d1.person_id = t.person_id
LEFT JOIN d2
ON d2.person_id = t.person_id
WHERE ...
这将为您提供这3个表中ref_id的第一个非NULL
值。
编辑:
为了澄清你在想什么,一个UNION
垂直连接的数据集或表,如
SELECT 1,2,3
UNION
SELECT 4,5,6
会给你
1,2,3
4,5,6
一个JOIN
所连接将行中的一行连接到另一个表中的行以“扩展” e用两个表中的值排出。
像下面的东西。请注意,如果d1或d2中的任何一个对于相同的person_id具有多行,您仍然可以获得比主表中更多的行。如果不是,它不应该给你更多的行。
Select
m.*
, d1.*
, d2.*
From
main m
Left Join
d1
On
m.person_id = d1.person_id
And
m.ref_id Is Null
Left Join
d2
On
m.person_id = d1.person_id
And
m.ref_id Is Null
And
d1.ref_id Is Null
JNK的答案是最好的,我想。但只是为了展示另一种方法,您可以将它作为单个联合与UNION进行联合。取决于数据集,一种方法或另一种方法可能更有效。
SELECT person_id, fee,
COALESCE (m.ref_id, d.ref_id) as 'ref_id',
...
FROM table t
LEFT JOIN (SELECT person_id, ref_id FROM d1 UNION ALL SELECT person_id, ref_id FROM d2) d
ON d.person_id = t.person_id
如果d1和d2具有相同person_id的行,则这将返回比原始表中更多的行。如果它们具有相同的(person_id,ref_id)元组,则将UNION ALL
更改为简单的UNION
应解决该问题;否则,您需要在问题中更具体,因为您可以从d1或d2获得不同的结果。
它们具有相同的person_id,ref_id元组。我也会测试一下。 – James 2011-03-17 19:22:30
正是我在写作过程中。 – 2011-03-17 19:07:38
@Dave - 总是一个好兆头我在正确的轨道上:) – JNK 2011-03-17 19:08:11
好的,我正在考虑做一个连接(m和d1),然后联合到另一个连接(m和d2)。但那完全是关闭的。谢谢,我会试试这个! – James 2011-03-17 19:14:30