sql SELECT查询 - 它合并了两个相同的表?

时间:2011-04-15 08:48:12

标签: sql

所以我有2张桌子。 EmployeeDraft_Employee。它们是相同的,除了Draft_Employee中的属性允许空值。

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

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

首先,它会看到是否可以在Employee表中找到具有相同EmpID的员工。 如果找到,它将查看Draft_Employee中的员工并查找NULL或EMPTY属性。然后它将获取Employee表中相同字段的值,并将其放入draft_Employee中的空或NULL字段

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

右边是员工,左边是Draft_Employee。

我想要一个产生

的SQL查询
empID   name     something1   something2
-----   ----     ----------   ----------
2       Michael  txttxt       text2fs

我最接近的是LEFT OUTER JOIN但是它给了我来自两个表的数据

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

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...

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

使用coalesce函数获取第一个非空值:

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

答案 3 :(得分:0)

如何使用UNIONGROUP BY

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