从两个不同的表中获取空值的值?

问题描述:

我有一个大表(主)像这样从两个不同的表中获取空值的值?

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用两个表中的值排出。

+0

正是我在写作过程中。 – 2011-03-17 19:07:38

+0

@Dave - 总是一个好兆头我在正确的轨道上:) – JNK 2011-03-17 19:08:11

+0

好的,我正在考虑做一个连接(m和d1),然后联合到另一个连接(m和d2)。但那完全是关闭的。谢谢,我会试试这个! – James 2011-03-17 19:14:30

像下面的东西。请注意,如果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获得不同的结果。

+0

它们具有相同的person_id,ref_id元组。我也会测试一下。 – James 2011-03-17 19:22:30