2011-04-27 40 views
3

我正在使用C#和SQL Server。内部连接的SQL Server NULL值

看看下面的SQL:

SELECT table1.id, table1.description, table2.name, table2.surname 
FROM table1 
    INNER JOIN table2 ON table1.EmpID = table2.EmpID 

它是直线前进,并能正常工作。它从table1表中检索数据就好了,内部加入table1.empidtable2.nametable2.surname正确。

现在,有时table1.empid为空,当它是时,此SQL只是忽略具有空值的“行”;根据标准这是非常正常的。

我在这里需要的是也得到与空值“行”,当table1.empid为空我需要设置一个自定义值为table2.nametable2.surname

我一直在玩isnull(),但我所做的只是让它变得更糟。

有什么建议吗?

感谢

+0

你真的需要提供一些样本数据与一些预期的产出。例如,当table1.EmpID为Null时,应该显示table2的哪些行?没有? – Thomas 2011-04-27 20:51:09

回答

10

你需要做一个LEFT JOIN:

SELECT table1.id, table1.description, table2.name, table2.surname FROM table1 
LEFT JOIN table2 ON table1.EmpID = table2.EmpID; 
+1

关闭,但table1的值不一定是空的记录显示;如果没有包含该empID的table2记录,它仍然在结果中。而且,table2的值总是会返回null,而不是像OP想要的那样允许“自定义值”。 – KeithS 2011-04-27 20:39:01

+1

原始问题没有说明可以返回非空值的表2中没有匹配的记录。要设置默认值,如果值为空,您可以使用:SELECT table1.id,table1.description,ISNULL(table2.name,'John'),ISNULL(table2.surname,'Smith')FROM table1 LEFT JOIN table2 ON table1.EmpID = table2.EmpID; – 2011-04-27 21:20:45

+1

多数民众赞成我需要的,谢谢DotNetHacker – Yash 2011-04-27 23:22:04

0

尝试使用UNION:

SELECT table1.id, table1.description, table2.name, table2.surname 
FROM table1 
INNER JOIN table2 ON table1.EmpID = table2.EmpID 
UNION 
SELECT table1.id, table1.description, 'Table 2 Null', 'Table 2 Null' 
FROM table1 
WHERE table1.empId is null 
0
Select table1.id table1.description 
    , Case When table1.EmpID Is Null Then 'Some Value' Else table2.name End As Table2Name 
    , Case When table1.EmpID Is Null Then 'Some Value' Else table2.surname End As Table2Surname 
From table1 
    Left Join table2 
     On table2.EmpID = table1.EmpID 
Where table1.EmpID Is Null 
     Or table2.EmpID Is Not Null 
+0

这将取代现有记录中的空值; table2.surname可以合法地为null,并且OP仅声明他希望不存在记录的自定义值。另外,如果table1.empID不为null,但不存在具有该empID的table2,则只有当table1.empID为null时,OP才会显示table1记录。 – KeithS 2011-04-27 20:46:43

+0

@KeithS - WRT给零姓或名字,我们不告诉他们是否可以空。无论如何,我重新考虑了解决方案。 – Thomas 2011-04-27 20:56:07

0

如果表1为空,你仍然需要记录你不能从那开始。从table2开始并加入table1。

SELECT table1.id, table1.description, ISNULL(table1.empid, "some new value") AS name, table2.surname 
FROM table2 
    LEFT OUTER JOIN table1 ON table2.EmpID = table1.EmpID 
0
SELECT table1.id 
     ,table1.description 
     ,COALESCE(table2.name, 'DEFAULT') AS name 
     ,COALESCE(table2.surname, 'DEFAULT') AS surname 
FROM table1 
LEFT JOIN table2 
    ON table1.EmpID = table2.EmpID 

现在请注意,这也将包括人时的EmpID不为空,但仍然“无效的”,如果他们table1中有一个的EmpID,但它不是在表2中,因此,如果这你想避免的事情,另一种选择是这样的:

SELECT table1.id 
     ,table1.description 
     ,table2.name 
     ,table2.surname 
FROM table1 
INNER JOIN table2 
    ON table1.EmpID = table2.EmpID 

UNION ALL 

SELECT table1.id 
     ,table1.description 
     ,'DEFAULT' AS name 
     ,'DEFAULT' AS surname 
FROM table1 
WHERE table1.EmpID IS NULL