我首先要说的是,我正在处理两个表格,这些表格在组织方面有点混乱。我目前正在恳求我的案子进行调整,但无法控制它们。所以桌子的组织是我无法控制的。
我有一个看起来像这样的表
客户
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 表中选择记录吗?我需要这个,因为我不想要重复,并且更喜欢保留与最新表格布局匹配的记录。
答案 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)