背景
我有一个有六列的表。前三列创建 pk。我的任务是删除其中一个 pk 列。
我选择(使用不同的)数据到临时表(不包括第三列)中,并尝试将所有数据插入原始表中,每行的第三列为“11”,因为这是我被指示的做。(此列将在我执行此操作后被 DBA 删除)
但是,当我将这些数据插入到原始表中时,我得到了一个 pk 约束错误。(震惊,我知道)
其他三列只是日期列,因此不同的选择没有为每条记录创建唯一的 pk。我想要实现的只是在前两列上调用一个 distinct,然后任意选择其他三列,因为我选择哪个日期并不重要(至少不是在开发上)。
我试过的
我发现以下帖子似乎达到了我想要的效果:
我尝试了乔尔和欧文的答案。
尝试1:
但是,对于 Joels 的回答,返回的集合太大 - 内部连接没有做我认为它会做的事情。选择不同的 col1 和 col2 会返回 400 列,但是当我使用他的解决方案时会返回 600 行。我检查了数据,实际上有重复的pk。这是我复制乔尔斯答案的尝试:
select a.emp_no,
a.eec_planning_unit_cde,
'11' as area, create_dte,
create_by_emp_no, modify_dte,
modify_by_emp_no
from tempdb.guest.temp_part_time_evaluator b
inner join
(
select emp_no, eec_planning_unit_cde
from tempdb.guest.temp_part_time_evaluator
group by emp_no, eec_planning_unit_cde
) a
ON b.emp_no = a.emp_no AND b.eec_planning_unit_cde = a.eec_planning_unit_cde
现在,如果我只执行内部选择语句,则返回 400 行。如果我选择整个查询返回 600 行?内连接不应该只显示两组的交集吗?
尝试2:
我也尝试了欧文的答案。这个有语法错误,我在搜索 where 子句的规范时遇到了麻烦(特别是他使用 with 的技巧(emp_no, eec_planning_unit_cde)
)
这是尝试:
select emp_no,
eec_planning_unit_cde,
'11' as area, create_dte,
create_by_emp_no,
modify_dte,
modify_by_emp_no
where (emp_no, eec_planning_unit_cde) IN
(
select emp_no, eec_planning_unit_cde
from tempdb.guest.temp_part_time_evaluator
group by emp_no, eec_planning_unit_cde
)
现在,我意识到我引用的帖子是针对 postgresql 的。T-SQL没有类似的东西吗?尝试谷歌括号效果不太好。
问题概述:
- 为什么内部连接不返回两个集合的交集?从谷歌搜索这是我认为应该做的
- 是否有另一种方法可以实现我在 t-sql 中尝试 2 时尝试的相同方法?
- 我使用其中的哪一个,或者如果我使用另一种解决方案对我来说并不重要......我应该怎么做?