SQL Union更喜欢一个表中的记录?

时间:2015-08-21 20:09:44

标签: sql sql-server duplicates union

我首先要说的是,我正在处理两个表格,这些表格在组织方面有点混乱。我目前正在恳求我的案子进行调整,但无法控制它们。所以桌子的组织是我无法控制的。

我有一个看起来像这样的表

客户

my_integer

自创建客户表以来,已创建另一个表来保存客户信息

顾客2

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

您会注意到,虽然Customer2包含前两个条目的新客户,但它也包含Bob,它与第一个表中的bob相同,其中包含与新Customer2表布局匹配的更新信息。

我需要根据ID列表将所有这些记录选择到一个结果集中,假设ID是唯一的。因此,我们可以确定客户中的Bob与Customer2中的Bob相同。我目前正在使用像这样的联合声明。

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

然而,这会产生一个看起来像这样的表

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)

我们可以看到我们已经重复了#39; Bob 的记录,这些记录并非真正重复。我的问题是:当我遇到'重复'像这样,我有什么方法可以指定只从 Customer2 表中选择记录吗?我需要这个,因为我不想要重复,并且更喜欢保留与最新表格布局匹配的记录。

2 个答案:

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

任何一方都来自客户那些, Customer2 ,并将它们与 Customer2

| 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

我自己虽然,我通常更喜欢使用日期粒子的三列真正的日期列...

如果需要调整/进一步详细说明,请发表评论。

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