個人事業主の方必見!確定申告のお悩み解決

テーブルの移行(Aテーブルのデータをキーを変更してBテーブルにInsertする)を行ったところ、
ERROR: duplicate key violates unique constraint "Bテーブル_unique"とメッセージが出ます。

SQL文はつぎの通りです。
INSERT INTO Bテーブル(契約番号, ユニット番号, 資源番号, 入力日, 数量)
SELECT a.契約番号, a.ユニット番号, a.資源番号, a.入力日, a.数量
FROM Aテーブル a ;
Bテーブルのキーは、契約番号, ユニット番号, 資源番号, 入力日です。
Aテーブルのキーは、契約番号,入力日,レベル1,レベル2です。

データ件数は約3万件です。

Bテーブルを調査して、重複となるレコードを表示させたいのですが、
SQL文がわかりません。

よろしくご教授ください。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

>Bテーブルを調査して、重複となるレコードを


ターゲットが違うでしょ。Bには重複レコードは
できないんだから・・・
AテーブルからBテーブルのキーとなる項目で
グループ化し、そのレコード数が2以上ならば
重複になる。
SELECT 契約番号,ユニット番号,資源番号,
入力日,COUNT(契約番号) AS 件数
FROM Aテーブル GROUP BY 契約番号,
ユニット番号,資源番号,入力日
HAVING COUNT(契約番号)>1
    • good
    • 0
この回答へのお礼

さっそくのご回答ありがとうございます。

試してみます。

お礼日時:2011/12/20 09:31

このQ&Aに関連する人気のQ&A

SQL 文」に関するQ&A: batファイルからsql文実行

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q重複チェックを行わず、INSERT時にエラーではじけないか?

最近オラクルを学んでいるものです。勉強をしていて思った素朴な疑問があ
るのでみなさん教えて下さい。

INSERTにて一意の部分が重複するとエラーで落ちてしまうと思うのですが、
だからと言ってINSERT手前で重複チェック、つまり一度DBを読んでから、
INNSERTすると返って二度手間ですし、これが業務アプリの場合レスポン
スが悪くなりますよね?

何かこれを回避できる良い手段はあるのでしょうか?
初歩的な事かもしれませんがよろしくお願いします。

Aベストアンサー

昔やった方法ですが、エラーコードを判定することによって回避可能です

・いきなりInsertする(正常終了はもちろん問題なし)
・エラー時 それは一意制約のエラーコード?を判定
一意制約エラーなら → 次の処理へ? ・・・
それ以外のエラーなら → 落とす? ・・・ など

ちなみにselectでチェックしてからinsertの場合でも
そのわずかの間に他からinsertされていて、エラーになることもあります
(同時にinsertしにいくことがなければ問題ありませんが)

QInsert Into Select での重複について

DB:SQLServer2000

こんにちは
お世話になっております。

トランザクションのテーブルA から ワークのテーブルBへInsert Into Select を使用してデータを格納しているのですが、その際に重複が発生してしまいます。

テーブルA 主キーあり
テーブルB 主キーなし

Delete B

Insert into B select 項目1,項目2,・・・
from A With(Nolock)
where 日付項目 = 20080101

テーブルAの主キー項目は全てテーブルBへInsertしており、Insert完了後のテーブルBの中身を見ると、まれに全く同じデータが2件出来ていることがあります。

このInsert into selectが実行されている間に、テーブルAに対して登録更新が行われることもあります。

色々と試してはいるのですが、原因が特定できずに困っております。
もし何かお気づきになられる方がいらっしゃいましたら、ご教示下さい。

よろしくお願い致します。

Aベストアンサー

>>・すでに存在するレコードA1をテーブルAにInsertして(これがCOMMITするまではエラーにならないとして)、COMMITしないうちにSELECTされる
>⇒十分にあり得るとは思いますが、この様な場合は、既に存在するレコードA1と新たにInsertされようとした重複するレコードA1’がNolockでSelectした場合2件抽出されることになるのでしょうか?

理論上はあり得ると思いますね。

ただROLLBACKのログがない、ということですから、これもあり得ないということでしょうか。
エラーになったらROLLBACKされるはずですよね。

となると、いよいよわかりません。

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Q秒を時分秒に変換する

EXCELで秒を時分秒に変換することは可能でしょうか?
19827635秒を何時間何分何秒に変換するもの

Aベストアンサー

A1に19827635秒が入っているとして
別のセルに
=TEXT(A1/24/60/60,"[h]時間mm分ss秒")
とすれば出きそうです。
5507時間40分35秒

QPostgreSQLで小数点以下を処理する関数はありますか?

update a_tbl set b_fld=a_fld * 1.05;

とした場合にb_fldがintegerの場合どうなるのでしょうか?

SQL分で、切り上げ、切捨て、四捨五入は可能でしょうか?

また、Cygwin版のPostgreSQLでVisualBasicのクライアントプログラムから利用できるのでしょうか?

Aベストアンサー

#1さん以外
b_fldがintegerの場合、小数第1位で四捨五入され、整数としてb_fldに入る様です。

四捨五入:select round(b_fld,0) from a_tbl;
(小数第1位で四捨五入して整数にする。0のところを1にすれば、小数2位で1位まで)
切り捨て:select trunc(b_fld) from a_tbl;
切り上げ:select ceil(b_fld) from a_tbl;

QSELECT結果から重複行を除く方法

下記のようなテーブルから重複なくSELECTしたいと考えています。

temp_table
------------------------
| id | name_1 | name_2 |
------------------------
| 1 | aaaaaa | bbbbbb |
| 2 | cccccc | dddddd |
| 3 | cccccc | dddddd |
| 4 | aaaaaa | bbbbbb |
| 5 | cccccc | jjjjjj |
------------------------

SELECT結果が下記の要になるのが理想です。
DISTINCTを利用して
SELECT DISTINCT id, name_1 || name_2 AS name FROM temp_tableとしましたがダメでした。

---------------------
| id | name     |
---------------------
| 3 | ccccccdddddd |
| 4 | aaaaaabbbbbb |
| 5 | ccccccjjjjjj |
---------------------

よい方法をご存じの方、宜しくお願いします。

下記のようなテーブルから重複なくSELECTしたいと考えています。

temp_table
------------------------
| id | name_1 | name_2 |
------------------------
| 1 | aaaaaa | bbbbbb |
| 2 | cccccc | dddddd |
| 3 | cccccc | dddddd |
| 4 | aaaaaa | bbbbbb |
| 5 | cccccc | jjjjjj |
------------------------

SELECT結果が下記の要になるのが理想です。
DISTINCTを利用して
SELECT DISTINCT id, name_1 || name_2 AS name FROM temp_tableとしましたがダメでした。

---------------...続きを読む

Aベストアンサー

distinct の使い方が間違ってます。
select distinct on (name_1, name_2) id, name_1, name_2 from temp_table;

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q【VB】コンボボックスにデータベースから取り出した値を入れたい

VB2005です。

表題の通りですがやり方がよくわかりません。
データベースに接続し、
SQLで重複しない値を取り出すところまではできています。

SQL=SELECT DISTINCT FieldName FROM TableName

VB6の時はこんなソースでした
Do Until rs.EOF
   Combo1.AddItem.Fields("FieldName")
   rs.MoveNext
Loop

VB2005ではどう書くのでしょう?
よろしくご教授ください。

Aベストアンサー

DataReaderを使用したサンプルです
※DBMSが記述されていないので、接続文字列はアクセスの場合です
※テキスト書きなので試験していません
※DataSetを使用する方法もありますが、コンボボックスに表示する程度ならDataReaderで大丈夫でしょう
※VB2005ならば、TableAdapterという便利なクラスがあるそうです
※VisualStudio2005 まださわってません orz

  Dim dbFilePath As String = "C:\testdb.mdb"
  Dim connectionString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", dbFilePath)
  Dim sql As String = "SELECT DISTINCT FieldName FROM TableName"
  Dim conn As New OleDbConnection(connectionString)
  Dim query As New OleDbCommand(sql, conn)

  Try
    conn.Open()
    Dim reader As OleDbDataReader = query.ExecuteReader()
    While (reader.Read())
      Me.ComboBox1.Items.Add(reader.Item("FieldName"))
    End While
    reader.Close()
  Catch ex As Exception
    MessageBox.Show(ex.Message)
  Finally
    conn.Close()
  End Try

DataReaderを使用したサンプルです
※DBMSが記述されていないので、接続文字列はアクセスの場合です
※テキスト書きなので試験していません
※DataSetを使用する方法もありますが、コンボボックスに表示する程度ならDataReaderで大丈夫でしょう
※VB2005ならば、TableAdapterという便利なクラスがあるそうです
※VisualStudio2005 まださわってません orz

  Dim dbFilePath As String = "C:\testdb.mdb"
  Dim connectionString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Sourc...続きを読む

QSQL文について(片方のテーブルに存在しないレコード抽出)

以下のような2つのテーブルがあったとして、
2つともに存在する「店コード」を抽出するのはSQLは分かるのですが、
片方に存在しない「店コード」(以下の例の場合、「2」)を抽出するSQLを
一文で書くにはどうすればいいのでしょうか?

<店テーブル>
店コード住所・・・(その他、基本情報)
1aaa
2bbb
3ccc

<販売テーブル>
店コード販売品目・・・(その他、販売数など)
1xxx
3zzz

Aベストアンサー

オプティマイザ次第だけど、NOT-INは、あまりお勧めでない。
外部結合も索引があっても有効に使われないので、お勧めでない。

select * from A where not exists(select 1 from B where A.店コード=B.店コード);

QPostgreSQLのtimestamp型で時間(分)を抽出したい

PostgreSQLのあるテーブルで「開始時刻」と「終了時刻」というフィールドがあり、timestamp with timezone(例:2008-07-31 07:00:00+09)でデータを持っています。

例えば、日付に関係なく13:00から15:00までのデータを抽出したい場合、SQLのWHERE句にはどのように記述すればよろしいのでしょうか?

Aベストアンサー

それなら早く言ってよ(笑)
to_char(開始時刻, 'HH24:MI') >= '13:30'
AND to_char(終了時刻, 'HH24:MI') <= '15:40'

http://www.postgresql.jp/document/pg734doc/user/functions-formatting.html

参考URLの文章の中に関連事項のリンクもあったはず。


人気Q&Aランキング