2011-04-15 139 views
1

所以我有2张桌子。 EmployeeDraft_Employee。它们是相同的,但Draft_Employee中的属性允许为空值。SQL SELECT查询 - 合并2个相同的表?

2个相同表的原因是draft_Employee是一个用于导入过程的表 - 它是一个tempoary容器。我们不希望数据与生产员工混淆。

现在,当必须导入员工时,系统必须检查员工是否已存在于数据库中。

首先看看它是否可以在Employee表中找到具有相同EmpID的雇员。 如果找到,它将查看Draft_Employee中的员工并查找NULL或EMPTY属性。那么这将需要价值为Employee表中同一领域,并把球送入空或NULL字段draft_Employee

empID name something1 something2 | empID name something1 something2 
----- ---- ---------- ---------- | ----  ---- ---------- ----------- 
1  Casper blahblah blahblah2 | 2  Michael NULL   text2fs 
2  Michael txttxt     | 

权是员工和左是Draft_Employee。

我想产生

empID name  something1 something2 
----- ----  ---------- ---------- 
2  Michael txttxt  text2fs 

我来最接近的,是LEFT OUTER JOIN一个SQL查询,但它给我的数据来自两个表

编辑:我的查询。我之前没有使用它,因为拼写是丹麦语。

SELECT * FROM Kladde_Ressource 
LEFT OUTER JOIN Ressource 
ON Ressource.RessourceID = Kladde_Ressource.RessourceID 
WHERE Kladde_Ressource.EAN = '' 
OR Kladde_Ressource.navnLang = '' 
OR Kladde_Ressource.navnKort = '' 
etc... 
+0

您能否显示您使用的查询? – 2011-04-15 08:52:26

+2

如果Emplyee表不允许空值,为什么示例数据中存在空值? – Guffa 2011-04-15 08:57:42

+0

不错,赶上!我刚刚写了一个简单的我的表格,并犯了一个错误。现在更正 – CasperT 2011-04-15 09:03:45

回答

4

我并不完全掌握你的要求,所以我立足我对数据的查询和需要的结果您发布。

至于得到的结果合并成一个结果集

  • 使用COALESCE得到两个表中的第一个非NULL值。使用INNER JOIN删除不匹配的行。

声明

SELECT e.empID 
     , COALESCE(e.name, de.name) AS name 
     , COALESCE(e.something1, de.something1) AS something1 
     , COALESCE(e.something2, de.something2) AS something2 
FROM employee e 
     INNER JOIN draft_employee de ON de.empID = e.empID 
+0

太棒了。我不知道那个功能/方法。我如何检索结果,所以它看起来像我选择/返回draft_employee?我使用它作为一个存储过程,所以这将是很好,只是得到一个Draft_Employee对象(C#)返回 – CasperT 2011-04-15 08:58:00

+0

@CasperT,您可以命名列。我改变了我的回答以反映这一点。 – 2011-04-15 09:01:41

+0

我们有一个赢家。非常感谢。你已经让我的早晨 – CasperT 2011-04-15 09:04:35

1

使用​​3210函数来获得的第一个非空值:关于使用UNIONGROUP BY

select 
    e.empID, 
    coalesce(d.name, e.name), 
    coalesce(d.something1, e.something1), 
    coalesce(d.something2, e.something2) 
from 
    Employee e 
    inner join Draft_Employee d on d.empID = e.empID 
0

如何:

SELECT empID, name, MAX(something1) AS something1, MAX(something2) AS something2 
FROM (
    SELECT empID, name, something1, something2 FROM Employee WHERE empID = 2 
    UNION 
    SELECT empID, name, something1, something2 FROM draft_Employee WHERE empID = 2 
) 
GROUP BY empID, name 
3

这应该是诀窍:

SELECT Employee.empId, 
     ISNULL(Employee.name, Draft_Employee.name) AS name, 
     ISNULL(Employee.something1, Draft_Employee.something1) AS something1, 
     ISNULL(Employee.something2, Draft_Employee.something2) AS something2 
FROM Employee LEFT OUTER JOIN 
     Draft_Employee ON Employee.empID = Draft_Employee.EmpId