C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: SQL 2005 INSERTについて


(過去ログ 86 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■51473 / inTopicNo.1)  SQL 2005 INSERTについて
  
□投稿者/ zun (1回)-(2010/07/07(Wed) 10:37:11)

分類:[データベース全般] 

SQLの初心者です。
現在Visual stdio 2008 とSQL SERVER 2005を使って開発しています。

INSERTとSELECTを使って一度のINSERT文にて複数行のデータを追加するSQLを作成中のなのですが、

「メッセージ 512、レベル 16、状態 1、プロシージャ insert_event、行 14
サブクエリは複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後に続く場合や、サブクエリが 1 つの式として使われる場合は複数の値は許可されません。」

と表示されエラーになってしまいます。

上記エラー内容についてサイト等調べてみたのですが、
よい情報がなくどのような処置を行っていいのかわかりません。
上記エラー内容は具体的にどのようなことなのでしょうか?



引用返信 編集キー/
■51474 / inTopicNo.2)  Re[1]: SQL 2005 INSERTについて
□投稿者/ ごう (123回)-(2010/07/07(Wed) 10:45:41)
どんなSQL文を書いているかわからないので
的確なコメントがしにくいのですが、

まず、サブクエリとして使っている(と、私が勝手に推測する)SELECT文が単独で動作するか試してみては?

(SELECT文が、複数レコードを返すと具合が悪いようなSQL文を書いているかもしれません。
それも、サブクエリをどのように利用しているかによりますが)
引用返信 編集キー/
■51475 / inTopicNo.3)  Re[2]: SQL 2005 INSERTについて
□投稿者/ zun (2回)-(2010/07/07(Wed) 11:00:38)
No51474 (ごう さん) に返信
> どんなSQL文を書いているかわからないので
> 的確なコメントがしにくいのですが、

開発上SQL文は公表できないのですいません。

> まず、サブクエリとして使っている(と、私が勝手に推測する)SELECT文が単独で動作するか試してみては?

SELECT文ですが単独ではきちんと動作するは確認済みです。

> (SELECT文が、複数レコードを返すと具合が悪いようなSQL文を書いているかもしれません。
> それも、サブクエリをどのように利用しているかによりますが)

INSERTするテーブル構造に合った、いくつかのテーブルを結合したSELECT文を作成し500行ほどSELECTされ、
それをINSERTしようとしています。

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


引用返信 編集キー/
■51476 / inTopicNo.4)  Re[3]: SQL 2005 INSERTについて
□投稿者/ 囚人 (519回)-(2010/07/07(Wed) 11:12:16)
列名を変えるとか工夫してみたらどうです? 「問題を見ずにヒントだけ見せて問題を想像して答えを導け」というのは難しいですよ。

例えば、

insert into aiueo(

)
select * from hoge
where hoge.ID = (select id from fuga where fuga.key = hoge.key)

で、select id from fuga where fuga.key = hoge.key が複数の値返してる。
みたいな感じの SQL じゃないですか?

引用返信 編集キー/
■51477 / inTopicNo.5)  Re[3]: SQL 2005 INSERTについて
□投稿者/ ごう (124回)-(2010/07/07(Wed) 11:13:36)
No51475 (zun さん) に返信

> INSERTするテーブル構造に合った、いくつかのテーブルを結合したSELECT文を作成し500行ほどSELECTされ、
> それをINSERTしようとしています。

この文が理解できませんでした。
つまり、サブクエリー(SELECT文)を実行させると500行ほどのレコードが得られて、
その約500行分のデータをINSERTしたいってことでしょうか?
引用返信 編集キー/
■51478 / inTopicNo.6)  Re[4]: SQL 2005 INSERTについて
□投稿者/ かたぎり (37回)-(2010/07/07(Wed) 11:19:25)
サブクエリで得られるレコードと、メインで使いたいSQLのレコードが1:1になってますか?

キー同士をつなげた時に1:1とならない場合にはそのメッセージが出ます。

その場合には = でくっつけずに、IN句でつなげば確実ですが、

その対処で適切かどうかはSQLが提示されていない以上、
これ以上のヒントはこちらからも出せないです。

引用返信 編集キー/
■51479 / inTopicNo.7)  Re[4]: SQL 2005 INSERTについて
□投稿者/ zun (3回)-(2010/07/07(Wed) 11:26:01)
No51477 (ごう さん) に返信
> ■No51475 (zun さん) に返信
>
>>INSERTするテーブル構造に合った、いくつかのテーブルを結合したSELECT文を作成し500行ほどSELECTされ、
>>それをINSERTしようとしています。
>
> この文が理解できませんでした。
> つまり、サブクエリー(SELECT文)を実行させると500行ほどのレコードが得られて、
> その約500行分のデータをINSERTしたいってことでしょうか?

文章が表現が曖昧で申し訳ありません。
約500行分のデータをINSERTしたいです。
引用返信 編集キー/
■51480 / inTopicNo.8)  Re[4]: SQL 2005 INSERTについて
□投稿者/ zun (4回)-(2010/07/07(Wed) 11:32:29)
No51476 (囚人 さん) に返信
> 列名を変えるとか工夫してみたらどうです? 「問題を見ずにヒントだけ見せて問題を想像して答えを導け」というのは難しいですよ。
>
申し訳ありません。

> 例えば、
>
> insert into aiueo(
> …
> )
> select * from hoge
> where hoge.ID = (select id from fuga where fuga.key = hoge.key)
>
> で、select id from fuga where fuga.key = hoge.key が複数の値返してる。
> みたいな感じの SQL じゃないですか?
>

下記の様な感じでSQLを作成しました。
insert int AAAテーブル(a int, b int, c varchar)
select bbb.a, ccc.b, ddd.c
from bbbテーブル as bbb
left join cccテーブル as ccc on bbb.x = ccc.x
left join dddテーブル as ddd on bbb.z = ddd.z

select文単体ですと500行ほどレコードが得られ、そのレコードをAAAテーブルにinsertする処理です。


引用返信 編集キー/
■51481 / inTopicNo.9)  Re[5]: SQL 2005 INSERTについて
□投稿者/ zun (5回)-(2010/07/07(Wed) 11:34:31)
No51478 (かたぎり さん) に返信
> サブクエリで得られるレコードと、メインで使いたいSQLのレコードが1:1になってますか?
>
> キー同士をつなげた時に1:1とならない場合にはそのメッセージが出ます。
>
> その場合には = でくっつけずに、IN句でつなげば確実ですが、
>
> その対処で適切かどうかはSQLが提示されていない以上、
> これ以上のヒントはこちらからも出せないです。
>

SQL初心者で知識が乏しい為,
> サブクエリで得られるレコードと、メインで使いたいSQLのレコードが1:1になってますか?
>
> キー同士をつなげた時に1:1とならない場合にはそのメッセージが出ます。
の内容の意味がよく理解できません。誠に申し訳ありません。

下記の様なSQLを作成しました。
insert int AAAテーブル(a int, b int, c varchar)
select bbb.a, ccc.b, ddd.c
from bbbテーブル as bbb
left join cccテーブル as ccc on bbb.x = ccc.x
left join dddテーブル as ddd on bbb.z = ddd.z

select 文単体ですと500行ほどレコードが得られ、そのレコードをAAAテーブルにinsertする処理です。

引用返信 編集キー/
■51483 / inTopicNo.10)  Re[5]: SQL 2005 INSERTについて
□投稿者/ ごう (125回)-(2010/07/07(Wed) 13:35:51)
No51480 (zun さん) に返信

当方の環境 SQL Server 2000 (および NorthWindサンプルデータベース)で下記のように試したところ、できました。
参考:NorthWindサンプルデータベース  http://msdn.microsoft.com/ja-jp/library/ms143221(SQL.90).aspx

(CustomerID, City, CompanyNameという列を持つテーブルaaaは作成済み)

INSERT INTO aaa (CustomerID, City, CompanyName)
SELECT bbb.CustomerID, ccc.City, ddd.CompanyName
FROM Orders as bbb
LEFT JOIN Employees as ccc on ccc.EmployeeID = bbb.EmployeeID
LEFT JOIN Shippers as ddd on ddd.ShipperID = bbb.ShipVia

これでできたとので、このSQL文自体には問題なさそうに見えます。
次はbbb(bbbテーブル)に問題がないか?ということが気になります。

bbbテーブルには本来何行のレコードがあるのでしょうか?

SELECT文単体

select bbb.a, ccc.b, ddd.c
from bbbテーブル as bbb
left join cccテーブル as ccc on bbb.x = ccc.x
left join dddテーブル as ddd on bbb.z = ddd.z

を実行すると、約500行のレコードが取得できたとのことですので、
bbbテーブルのデータが約500行でない場合に問題があるかもしれません。
あとは考えられるのが、sumとかcount関数を使用していないかどうか、とか確認してみてください。







引用返信 編集キー/
■51486 / inTopicNo.11)  Re[6]: SQL 2005 INSERTについて
□投稿者/ zun (6回)-(2010/07/07(Wed) 14:31:36)
No51483 (ごう さん) に返信
> ■No51480 (zun さん) に返信
>
> 当方の環境 SQL Server 2000 (および NorthWindサンプルデータベース)で下記のように試したところ、できました。
> 参考:NorthWindサンプルデータベース  http://msdn.microsoft.com/ja-jp/library/ms143221(SQL.90).aspx
>
> (CustomerID, City, CompanyNameという列を持つテーブルaaaは作成済み)
>
> INSERT INTO aaa (CustomerID, City, CompanyName)
> SELECT bbb.CustomerID, ccc.City, ddd.CompanyName
> FROM Orders as bbb
> LEFT JOIN Employees as ccc on ccc.EmployeeID = bbb.EmployeeID
> LEFT JOIN Shippers as ddd on ddd.ShipperID = bbb.ShipVia
>
> これでできたとので、このSQL文自体には問題なさそうに見えます。
> 次はbbb(bbbテーブル)に問題がないか?ということが気になります。
>
> bbbテーブルには本来何行のレコードがあるのでしょうか?
>
> SELECT文単体
>
> select bbb.a, ccc.b, ddd.c
> from bbbテーブル as bbb
> left join cccテーブル as ccc on bbb.x = ccc.x
> left join dddテーブル as ddd on bbb.z = ddd.z
>
> を実行すると、約500行のレコードが取得できたとのことですので、
> bbbテーブルのデータが約500行でない場合に問題があるかもしれません。

bbbテーブルにはもともと500レコードあります。
そのbbbテーブルに条件が合致したcccテーブルとdddテーブルを連結し、作成したレコードをaaaテーブルにINSERTしたです。

> あとは考えられるのが、sumとかcount関数を使用していないかどうか、とか確認してみてください。
特にsumとかcount関数等は使用しておりません。

もともとaaaテーブルにはレコード数が10万件以上あるので、処理時間を短くするためにも上記の方法が得策だと考えたのですが、違う方法を考えみるのも手でしょうか?


引用返信 編集キー/
■51487 / inTopicNo.12)  Re[6]: SQL 2005 INSERTについて
□投稿者/ マサヤ (64回)-(2010/07/07(Wed) 14:34:12)
2010/07/07(Wed) 14:34:38 編集(投稿者)

select count(*) from bbbテーブル as bbb
left join cccテーブル as ccc on bbb.x = ccc.x

select count(*) from bbbテーブル as bbb
left join dddテーブル as ddd on bbb.z = ddd.z

のクエリ結果はいかかがしょうか?

where句がありましたらそれぞれつけてください。
引用返信 編集キー/
■51488 / inTopicNo.13)  Re[7]: SQL 2005 INSERTについて
□投稿者/ zun (7回)-(2010/07/07(Wed) 14:50:55)
No51487 (マサヤ さん) に返信
> 2010/07/07(Wed) 14:34:38 編集(投稿者)
>
> select count(*) from bbbテーブル as bbb
> left join cccテーブル as ccc on bbb.x = ccc.x

カウント数500でした。

> select count(*) from bbbテーブル as bbb
> left join dddテーブル as ddd on bbb.z = ddd.z

カウント数500でした。

> のクエリ結果はいかかがしょうか?
>
> where句がありましたらそれぞれつけてください。

select bbb.a, ccc.b, ddd.c
from bbbテーブル as bbb
left join cccテーブル as ccc on bbb.x = ccc.x
left join dddテーブル as ddd on bbb.z = ddd.z

上記SQLで取得したレコード数を同じ結果となりました。



引用返信 編集キー/
■51492 / inTopicNo.14)  Re[7]: SQL 2005 INSERTについて
□投稿者/ マサヤ (65回)-(2010/07/07(Wed) 17:02:52)
INSERT SELECT のSELECT部分は問題ない、でよろしいのでしょうか?
おそらく、かたぎりさんのおっしゃっていることが正解かな、と思います。
また、INSERTとSELECTのどちらに問題があるかを切り分けるのが一番だと思います。
引用返信 編集キー/
■51494 / inTopicNo.15)  Re[8]: SQL 2005 INSERTについて
□投稿者/ zun (8回)-(2010/07/07(Wed) 17:47:13)
No51492 (マサヤ さん) に返信
> INSERT SELECT のSELECT部分は問題ない、でよろしいのでしょうか?
> おそらく、かたぎりさんのおっしゃっていることが正解かな、と思います。
> また、INSERTとSELECTのどちらに問題があるかを切り分けるのが一番だと思います。

いろいろありがとうございます。
違った手法を考えたいと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -