2015-08-21 45 views
1

我會開始說,我正在處理兩張表,它們的組織方式有點混亂。我目前正在懇求我的情況下進行調整,但無法控制他們。所以桌子的組織不在我的控制之下。SQL聯盟更喜歡從一個表的記錄?

我有一個表,看起來像這樣

客戶

| id | name | date_joined | 
|----|------|-------------| 
| 1 | Bob | 2012-01-01 | 
| 2 | Jack | 2012-01-01 | 
| 3 | Jill | 2012-01-01 | 

由於客戶表創建,另一個表已創建爲保持客戶信息

顧客2

| id | name | year_joined | month_joined | day_joined | 
|----|---------|-------------|--------------|------------| 
| 4 |  Ken |  2013 |   1 |   1 | 
| 5 | Lindsey |  2013 |   1 |   1 | 
| 1 |  Bob |  2012 |   1 |   1 | 

您會注意到,雖然Customer2包含前兩個條目的新客戶,但它還包含Bob,他與第一個表中的Bob具有相同的更新信息以匹配新的Customer2表格佈局。

我需要根據ID列表將所有這些記錄選擇到一個結果集中,假設ID是唯一的。因此,我們可以確定客戶中的鮑勃與客戶2中的鮑勃相同。我目前正在用這樣的工會聲明來做這件事。

select * 
from (
select id, 
name, 
date_joined, 
'' as year_joined, 
'' as month_joined, 
'' as day_joined 
from customer 
union 
select id, 
name, 
'' as date_joined, 
year_joined, 
month_joined, 
day_joined 
from customer2) 
as U where U.id in (list of ID's) 

然而這會導致看起來像這樣

| id | name | date_joined | year_joined | month_joined | day_joined | 
|----|---------|-------------|-------------|--------------|------------| 
| 4 |  Ken |    |  2013 |   1 |   1 | 
| 5 | Lindsey |    |  2013 |   1 |   1 | 
| 1 |  Bob |    |  2012 |   1 |   1 | 
| 1 |  Bob | 2012-01-01 |    |    |   | 
| 2 | Jack | 2012-01-01 |    |    |   | 
| 3 | Jill | 2012-01-01 |    |    |   | 

正如我們可以看到,我們有「重複」記錄鮑勃,這是不是真的重複表。我的問題是這樣的:當我遇到像這樣的'重複'時,是否有任何方法可以指定從Customer2表中選擇記錄?我需要這個,因爲我不想重複,而且更喜歡保留匹配最新表格佈局的記錄。

回答

1

這應該讓你開始:

SELECT 
    id 
    , name 
    , date_joined 
    , NULL year_joined 
    , NULL month_joined 
    , NULL day_joined 
FROM Customer 
WHERE id NOT IN (SELECT id FROM Customer2) 
UNION ALL 
SELECT 
    id 
    , name 
    , NULL 
    , year_joined 
    , month_joined 
    , day_joined 
FROM Customer2 
ORDER BY id 
; 

或者,只用SET操作:

(SELECT 
    id 
    , name 
    , date_joined 
    , NULL year_joined 
    , NULL month_joined 
    , NULL day_joined 
FROM Customer 
EXCEPT 
    (SELECT 
    id 
    , name 
    , CONVERT(DATE, 
      CAST(year_joined AS VARCHAR(4)) + '-' 
       + CAST(month_joined AS VARCHAR(2)) + '-' 
       + CAST(day_joined AS VARCHAR(2)) 
      , 102 
      ) 
    , NULL 
    , NULL 
    , NULL 
    FROM Customer2 
) 
) 
UNION ALL 
SELECT 
    id 
    , name 
    , NULL 
    , year_joined 
    , month_joined 
    , day_joined 
FROM Customer2 
ORDER BY id 
; 

無論是一個從客戶需要那些,不是發現於顧客2,並與所有在顧客2發現它們組合:

| id | name | date_joined | year_joined | month_joined | day_joined | 
|----|---------|-------------|-------------|--------------|------------| 
| 1 |  Bob |  (null) |  2012 |   1 |   1 | 
| 2 | Jack | 2012-01-01 |  (null) |  (null) |  (null) | 
| 3 | Jill | 2012-01-01 |  (null) |  (null) |  (null) | 
| 4 |  Ken |  (null) |  2013 |   1 |   1 | 
| 5 | Lindsey |  (null) |  2013 |   1 |   1 | 

看到它在行動:SQL Fiddle

我自己,雖然,我通常喜歡一個真正的日期列了三列,日期顆粒...

請發表評論,如果和這需要調整/進一步的細節。

+0

這就是我需要的。它非常簡單,我想我對聯盟的想法太多了,我忘了我可以在那裏放置一個where子句。謝謝一堆! – decal

0

您將不得不完全匹配數據。像這樣的東西可以工作:

select * 
from (
select id, 
name, 
datepart(year,date_joined) as year_joined, 
datepart(month,date_joined) as month_joined, 
datepart(day,date_joined) as day_joined 
from customer 
union 
select id, 
name, 
year_joined, 
month_joined, 
day_joined 
from customer2) 
as U where U.id in (list of ID's)