2011-04-15 48 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