2

バックグラウンド

6列のテーブルがあります。最初の 3 つの列は pk を作成します。pk 列の 1 つを削除する任務を負っています。

一時テーブル (3 番目の列を除く) にデータを (distinct を使用して) 選択し、そのすべてのデータを元のテーブルに挿入して、3 番目の列がすべての行で「11」であるようにしました。行う。(この列は、これを行った後、DBA によって削除されます)

ただし、このデータを元のテーブルに挿入しようとすると、pk 制約エラーが発生します。(ショッキング、私は知っている)

他の 3 つの列は単なる日付列であるため、個別の選択ではレコードごとに一意の pk が作成されませんでした。私が達成しようとしているのは、最初の2つの列でdistinctを呼び出してから、他の3つの列を任意に選択することです。これは、選択した日付は関係ありません(少なくともdevではありません)。

私が試したこと

私が望むものを達成しているように見える次の投稿を見つけました:

複数の列で SELECT DISTINCT を実行するにはどうすればよいですか (またはできますか)。

Joel と Erwin の両方からの回答を試しました。

試行 1:

ただし、Joels の回答では、返されるセットが大きすぎます。内部結合は、私が思っていたことを実行していません。個別の col1 と col2 を選択すると 400 列が返されますが、彼のソリューションを使用すると 600 行が返されます。データを確認したところ、実際には pk が重複していました。Joelsの回答を複製する私の試みは次のとおりです。

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

ここで、内側の select ステートメントだけを実行すると、400 行が返されます。クエリ全体を選択すると、600 行が返されますか? 内部結合は、2 つのセットの交点のみを表示することになっていませんか?

試行 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 つのセットの共通部分を返さないのはなぜですか? グーグルから、これは私がそれがすべきだと思ったことです
  2. t-sql の試行 2 で試したのと同じ方法を実現する別の方法はありますか?
  3. これらのどれを使用するか、または別のソリューションを使用するかは問題ではありません...どうすればよいですか?
4

3 に答える 3

2

個別の選択はすべての列に基づくため、最初の 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 つずつ返信します。

  1. 内部結合が 2 つのセットの共通部分を返さないのはなぜですか? グーグルから、これは私がそれがすべきだと思ったことです

    内部結合は交差を行いません。このテーブルを仮定しましょう:

    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 |
    

    そして、2 番目のクエリ アプローチ:

    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 2 番目のクエリを使用します。

于 2012-10-24T21:10:14.003 に答える