バックグラウンド
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 にも似たようなものはありませんか? 括弧をグーグルで検索しようとしてもうまくいきません。
質問の概要:
- 内部結合が 2 つのセットの共通部分を返さないのはなぜですか? グーグルから、これは私がそれがすべきだと思ったことです
- t-sql の試行 2 で試したのと同じ方法を実現する別の方法はありますか?
- これらのどれを使用するか、または別のソリューションを使用するかは問題ではありません...どうすればよいですか?