2

背景

我有一个有六列的表。前三列创建 pk。我的任务是删除其中一个 pk 列。

我选择(使用不同的)数据到临时表(不包括第三列)中,并尝试将所有数据插入原始表中,每行的第三列为“11”,因为这是我被指示的做。(此列将在我执行此操作后被 DBA 删除)

但是,当我将这些数据插入到原始表中时,我得到了一个 pk 约束错误。(震惊,我知道)

其他三列只是日期列,因此不同的选择没有为每条记录创建唯一的 pk。我想要实现的只是在前两列上调用一个 distinct,然后任意选择其他三列,因为我选择哪个日期并不重要(至少不是在开发上)。

我试过的

我发现以下帖子似乎达到了我想要的效果:

我如何(或我可以)在多列上选择 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没有类似的东西吗?尝试谷歌括号效果不太好。

问题概述:

  1. 为什么内部连接不返回两个集合的交集?从谷歌搜索这是我认为应该做的
  2. 是否有另一种方法可以实现我在 t-sql 中尝试 2 时尝试的相同方法?
  3. 我使用其中的哪一个,或者如果我使用另一种解决方案对我来说并不重要......我应该怎么做?
4

3 回答 3

2

选择不同的将基于所有列,因此它不保证前两个是不同的

select pk1, pk2, '11', max(c1), max(c2), max(c3) 
from table 
group by pk1, pk2 
于 2012-10-24T21:12:07.510 回答
1

你可以试试这个:

SELECT a.emp_no, 
        a.eec_planning_unit_cde, 
        b.'11' as area, 
        b.create_dte, 
        b.create_by_emp_no, 
        b.modify_dte,
        b.modify_by_emp_no
FROM 
(
    SELECT emp_no, eec_planning_unit_cde
    FROM tempdb.guest.temp_part_time_evaluator
    GROUP BY emp_no, eec_planning_unit_cde
) a 
JOIN tempdb.guest.temp_part_time_evaluator b 
     ON a.emp_no = b.emp_no AND a.eec_planning_unit_cde = b.eec_planning_unit_cde

这将使您在这些字段上有所不同,但如果列之间的数据存在差异,您可能不得不尝试更暴力的方法。

SELECT a.emp_no, 
        a.eec_planning_unit_cde, 
        a.'11' as area, 
        a.create_dte, 
        a.create_by_emp_no, 
        a.modify_dte,
        a.modify_by_emp_no
FROM 
(
    SELECT ROW_NUMBER() OVER(ORDER BY emp_no, eec_planning_unit_cde) rownumber,
            a.emp_no, 
            a.eec_planning_unit_cde, 
            a.'11' as area, 
            a.create_dte, 
            a.create_by_emp_no, 
            a.modify_dte,
            a.modify_by_emp_no
    FROM tempdb.guest.temp_part_time_evaluator
) a
WHERE rownumber = 1
于 2012-10-24T21:09:05.967 回答
1

我会一一回复:

  1. 为什么内部连接不返回两个集合的交集?从谷歌搜索这是我认为应该做的

    内连接不做交集。让我们假设这些表:

    T1   T2
    n s  n s
    1 A  2 X   
    2 B  2 Y
    2 C
    3 D
    

    如果您按数字列连接两个表,则不会得到交集(2 行)。你得到:

    select *
    from t1 inner join t2
       on t1.n = t2.n;
    
    | N | S |
    ---------
    | 2 | B |
    | 2 | B |
    | 2 | C |
    | 2 | C |
    

    而且,您的第二种查询方法:

    select *
    from t1 
    where t1.n in (select n from t2);
    
    | N | S |
    ---------
    | 2 | B |
    | 2 | C |
    
  2. 是否有另一种方法可以实现我在 t-sql 中尝试 2 时尝试的相同方法?

    是的,这个子查询:

    select *
    from t1 
    where not exists (
       select 1
       from t2
       where t2.n = t1.n
    );
    
  3. 我使用其中的哪一个,或者如果我使用另一种解决方案对我来说并不重要......我应该怎么做?

    是的,使用@JTC 第二个查询

于 2012-10-24T21:10:14.003 回答