ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

お世話になります。

更新のSQL文を考えているのですが、なかなかうまく動きません。
どなたか教えていただけないでしょうか?

やりたいことは、"KSK011"と"KSJ01"で"HINB"という項目で
マッチングしていたら、KSJ01の"ZAIK"をKSK011の"ZZAI"
にセットしたいと考えています。

UPDATE KSK011 SET KSK011.ZZAI = KSJ01.ZAIK
WHERE KSK011.HINB IN
(SELECT KSK011.HINB FROM(KSK011) INNER JOIN KSJ01 ON KSK011.
HINB = KSJ01.HINB)

動作させると、FROMのカッコが不適切とエラーがでます。カッコを取ると”マルチパート識別子 ??KSJ01.ZAIK?? をバインドできませんでした。”となります。どこがまずいのでしょうか?

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

BiND とは」に関するQ&A: binding offerとは?

A 回答 (2件)

下記の書き方だと、UPDATE句が参照可能なのはKSK011のみです。


WHERE句の IN内にサブクエリで書かれても「KSJ01」はメインで参照はできません。あくまでWHERE条件として使われます。

> UPDATE KSK011
> SET KSK011.ZZAI = KSJ01.ZAIK
>WHERE KSK011.HINB IN
>(SELECT KSK011.HINB FROM(KSK011)
> INNER JOIN KSJ01 ON KSK011.HINB = KSJ01.HINB);

上記をわかりやすくSELECT句で表現すると以下となります。
select xxx.colx1,zzz.colz1
from xxx
inner join zzz on zzz.colz1 = xxx.colx1
where xxx.colx1 in (select coly1 from yyy)

メインのSELECT句が参照できるのはFROM句で指定されたxxxと
ジョインしているzzzだけです。
yyyはin句の評価でしか使われません。

FROM句に入れていないのでSELECT候補ではありません。
FROM内にないものは参照できないと考えてください。

UPDATE文を考える時もSELECT文を考えてから置き換えたほうがわかりやすいです。SELECTできなければUPDATEもできません。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。

WHERE句なので、評価としてしか使えないんですね。
納得しました。 

丁寧な説明ありがとうございます。

お礼日時:2009/05/28 16:33

サブクエリの中でJOINしたところで、更新をするメインクエリがKSJ01を参照できないわけですから、そういうエラーになります。


SQL Serverの場合、正しくは以下の通りです。

UPDATE KSK011
SET KSK011.ZZAI = KSJ01.ZAIK
FROM KSK011
INNER JOIN KSJ01 ON KSK011.HINB = KSJ01.HINB

この回答への補足

jamshid6さん素早いアドバイスありがとうございます。

メインクエリでKSJ01を参照できないと言ってもらっていますが、
私の書いたほうの1行目でしょうか?
初歩的なことですが、KSJ01と書いてなぜ参照できないんでしょうか?

補足日時:2009/05/28 15:16
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

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

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テーブル名を[]でくくらないとエラーになってしまう

テーブル名を[]でくくらないとエラーになってしまいます

sqlserver 2008 express edition を利用しているのですが

テーブル名 やカラム名に[]でくくってSQL文を実行しないと
エラーが出てしまいます
例えば

select * from [table]  の様にしないといけません
これを
select * from table で実行できるようにしたいのです
どうしたらいいのでしょうか

会社ではsqlserver2005を利用しているので
2008からは[]でくくる必要になったのでしょうか

それとも初期設定で何かしないといけないのでしょうか
設定方法を教えて下さい

sqlserver management studio2008もインストール済みです

Aベストアンサー

「table」はSQLの予約語です。そのため初期設定などで、「table」をそのままSQL文に使用することは出来ません。これは他のRDBも同様です。
SQL SERVERでは[]で括ることで、予約語をオブジェクト名に出来ますが、おすすめは出来ません。
なお、ANSI/ISOの標準規格では「"(ダブルクォーテーション)」で括ることで、同様にエラーを回避できます。SQL SERVERでも初期設定でANSI/ISOと同様に「"」で括るモードにすることは出来ますが、それでも予約語である以上何らかの対応は必要です。

> 会社ではsqlserver2005を利用しているので
> 2008からは[]でくくる必要になったのでしょうか

そんなことはないはずです。

QUPDATE文のWHERE条件に他のテーブルのフィールドも入れたい

SQL文についてです。

表Aで列1と列2が'◎'のものについて、列3,列4,列5をそれぞれ'○','△','×'に更新したい場合は下記でOKだと思います。
UPDATE 表A
SET 列3 = '○', 列4 = '△', 列5 = '×'
WHERE 列1 = '◎' AND 列2 = '◎'

列1と列2をキーとして表Aと結合できる表Bが存在するとします。
条件に表Bの列6が'□'だった場合を追加したい時、どのような方法で行えば良いのでしょうか?
内部結合やWHERE EXISTSなどをいろいろ調べたのですが、SQL文に慣れていないためかうまくいきません。
初歩的な質問で申し訳ありませんが過去質問で参考になるものがなかったのでお願いします。

Aベストアンサー

UPDATE 表A
SET 列3 = '○', 列4 = '△', 列5 = '×'
WHERE 列1 = '◎' AND 列2 = '◎'
AND EXISTS
( SELECT 1 FROM 表B
WHERE 表B.列1 = 表A.列1
AND 表B.列2 = 表A.列2
AND 表B.列6 = '□' )
じゃだめですか。

Qクエリを分割せずに一つにまとめたクエリについて

以前投稿したのですが、抽出するテーブルに問題があり、
再度投稿させて頂きます。
SQLを使うのが初心者なので勉強をしながら作業を行なっています。そのため説明不足などありましたらご指摘願います。
[環境]
 データベース:SQLServer2005

質問内容は、
会員マスタテーブル
会員CD,会員住所,SHIMEI,KOSHINDAY
0001,東京,太郎,20090101
0001,千葉,太郎,20090102
0002,東京,次郎,20090101
0002,大阪,次郎,20090109
0003,大阪,三郎,20090109
0003,奈良,三郎,20090110
0004,大阪,四郎,20090109

代理人テーブル
会員CD,代理人CD,業務CD,KOSHINDAY
0001,0002,15,20090101
0001,0003,15,20090102
0002,0001,01,20090201
0002,0004,10,20090202
0003,0001,10,20090201
0003,0004,15,20090202
上記のようなテーブルがあります。
抽出結果ですが、
会員CD,会員住所,SHIMEI,KOSHINDAY,代理人CD,代理人住所,代理人名...
0001,千葉,太郎,20090102,0003,奈良,三郎,20090110
0002,大阪,次郎,20090109
0003,奈良,三郎,20090110,0004,大阪,四郎,20090109

会員マスタテーブルにて、各会員のKOSHINDAYが最大のデータを抽出します。
会員マスタテーブルの会員CDを元に、代理人テーブルを検索し各々KOSHINDAYが最大の代理人CDを求め、その時に業務CD=15のものだけを選び、
選び出された代理人CDで、会員マスタテーブルを検索し、
代理人の住所・氏名を抽出します。

上記内容なのですが、一回のSQL文で抽出が可能でしょうか?
仮想的にアクセスで検証したのですが、
作成出来ませんでした、すいませんが宜しくお願いします。

以前投稿したのですが、抽出するテーブルに問題があり、
再度投稿させて頂きます。
SQLを使うのが初心者なので勉強をしながら作業を行なっています。そのため説明不足などありましたらご指摘願います。
[環境]
 データベース:SQLServer2005

質問内容は、
会員マスタテーブル
会員CD,会員住所,SHIMEI,KOSHINDAY
0001,東京,太郎,20090101
0001,千葉,太郎,20090102
0002,東京,次郎,20090101
0002,大阪,次郎,20090109
0003,大阪,三郎,20090109
0003,奈良,三郎,20090110
0004,大阪,四郎,20090109

...続きを読む

Aベストアンサー

>エイリアスをA・B・Cと付けた場合に、次のエラー表示がされるのですが、どのような対処をすれば宜しいのでしょう。
>ちなみにA・B・Cをそれぞれのテーブル名
>A=会員マスタテーブル B=代理人テーブルとした場合は、エラーになりません。

クエリの後ろのエイリアスだけ変更して、「ON」の後ろの結合条件を変更しなかったときには、そのようなメッセージが出ます。
たとえば、こんな感じに

LEFT OUTER JOIN
(SELECT * FROM 代理人テーブル b1
WHERE b1.KOSHINDAY IN
(SELECT MAX(KOSHINDAY) FROM 代理人テーブル WHERE 会員CD=b1.会員CD)) b
ON 代理人テーブル.会員CD=会員マスタテーブル.会員CD

気をつけていただきたいのは、クエリは階層になっているわけですので、最終的なSELECT文はもはやクエリの結果を返すのに
会員マスタテーブルや代理人テーブルを直接は参照しておらず、あくまでも3つのクエリの結果(a,b,c)だけを使っているという点です。
従って、結合にはa,b,cだけを使うことができます。

>会員テーブルの更新日で(MAX関数)による抽出に対しては、1会員1行になる事は、確認済みです。

私が#2で書いたクエリは、

SELECT * FROM 会員マスタテーブル a1
WHERE a1.KOSHINDAY IN
(SELECT MAX(KOSHINDAY) FROM 会員マスタテーブル WHERE 会員CD=a1.会員CD)

SELECT * FROM 代理人テーブル b1
WHERE b1.KOSHINDAY IN
(SELECT MAX(KOSHINDAY) FROM 代理人テーブル WHERE 会員CD=b1.会員CD)

この上記2つのクエリ結果が常に1会員1行になるのであれば、会員CDでの重複は絶対に発生しません。
実際の環境に合わせてどのように書き換えられたかわかりませんので、そこをチェックしていただきたいです。

>エイリアスをA・B・Cと付けた場合に、次のエラー表示がされるのですが、どのような対処をすれば宜しいのでしょう。
>ちなみにA・B・Cをそれぞれのテーブル名
>A=会員マスタテーブル B=代理人テーブルとした場合は、エラーになりません。

クエリの後ろのエイリアスだけ変更して、「ON」の後ろの結合条件を変更しなかったときには、そのようなメッセージが出ます。
たとえば、こんな感じに

LEFT OUTER JOIN
(SELECT * FROM 代理人テーブル b1
WHERE b1.KOSHINDAY IN
(SELECT MAX(KOSHINDAY) FROM ...続きを読む

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Q型 varchar から型 numeric への変換エラー。

SQLクエリアナライザを使って、あるデータベースからLEFT JOINなどを駆使し、条件にそってデータを抽出しようと必死でやっております。
今まではうまく取得できていたのに、”型 varchar から型 numeric への変換エラー。”というエラーがでるようになりました。
前回とテーブルのデータを比較してみると、IsNULL(chrShokuhinCD,'') as chrShokuhinCDで引っ掛かっているようです。
この項目には空白(スペース)が入ったデータが最近存在しているのが原因だと思うのですが。。。
空白だったとき、IsNULL(chrShokuhinCD,'') as chrShokuhinCDはどのように修正すればよいでしょうか?教えてください。

Aベストアンサー

>空白だったとき、IsNULL(chrShokuhinCD,'') as chrShokuhinCDはどのように修正すればよいでしょうか?

では質問です。
空白だったとき、どんな数値として扱えばいいでしょうか?

これで何を入れればいいかわかると思いますが。

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日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

Q[SQLServer]既に存在するテーブルに他のテーブルからデータをINSERT

SQL初心者です。

既に存在するTable_A(レコード0件)に対して、これまた既に存在するTable_B(レコード100件)の内容をINSERTしたいです。次のように書くとだめですよね。
(Table_AとTable_Bのレイアウトはまったく同じ)

select * into Table_A from Table_B

何か策はあるのでしょうが、ちょっと探しきれません。お分かりになるかた教えてください。

Aベストアンサー

>(Table_AとTable_Bのレイアウトはまったく同じ)
これを読み飛ばしておりました。

ならばもっと省略できます
Insert Into Table_A
Select *
From Table_B
where フィールドB1 = 'ぱけらった' ←条件をつけるとき

Q学校の課題のSQLでVIEWの意味と作成方法がわかりません。

学校でSQLを使って、データベースを作るという期末課題がでました。

当方バイクの知識が少々あるため、バイクとバイク販売店というデータベースを作ってみることにしました。

バイクのデータ100個分とお店のデータは10個ほどなのですが、課題の条件の中にVIEWを作成すること、とあるのですが、VIEWとは何者なのでしょうか?
授業のページを見ても、難しい事しか載っていなくて困っています。

またテーブルの入力と、データの入力はなんとか覚えたのですが、VIEWの作り方は全く意味がわかりません。なので・・・

VIEWの意味と役割を教えてください。
初心者なので出来るだけわかりやすく教えていただけたら幸いです。
またVIEWの作成方法(create viewだとかなんとか・・・)を教えてください。
ちなみにテーブルデータとかはこんな感じに作っております。なのでこんな感じでVIEWの作成方法をご教授いただけたらありがたい次第です。
create table bike(
  maker text,
name text,
size int,
nennshiki date,
kaizou text,
shaken text,
nedann float,
shop text
)

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

学校でSQLを使って、データベースを作るという期末課題がでました。

当方バイクの知識が少々あるため、バイクとバイク販売店というデータベースを作ってみることにしました。

バイクのデータ100個分とお店のデータは10個ほどなのですが、課題の条件の中にVIEWを作成すること、とあるのですが、VIEWとは何者なのでしょうか?
授業のページを見ても、難しい事しか載っていなくて困っています。

またテーブルの入力と、データの入力はなんとか覚えたのですが、VIEWの作り方は全く意味がわか...続きを読む

Aベストアンサー

#1回答者です。

バイクは詳しくないので、自動車の例で説明します。

一つの表で、メーカー名や車種名などを管理すると、冗長な情報を管理することになってしまいます。

=====表定義例=====
create table メーカー
(メーカーid smallint primary key,
メーカー名 varchar(16));

create table 車種
(メーカーid smallint,
車種id smallint,
車種名 varchar(30),
primary key(メーカーid,車種id));

create table 型名情報
(メーカーid smallint,
車種id smallint,
型名 varchar(30) primary key,
年式 smallint,
排気量 smallint,
定価 int);
create index 型名情報idx on 型名情報(メーカーid,車種id);
=====ここまで=====

このように分けることで、メーカー名を車の情報分、持たなくてすみます。
仮にメーカー名が変更になった場合は、「メーカー」表のみを更新すればよくなります。

「マーチ」といった車種で、いろいろな年式があるでしょうから、車種名と年式といった情報も、表を分けます。

このようにして置くと、情報変更時の更新箇所が限られるし、メーカーの検索、車種名の検索といったことが容易に行えます。

=====データ例=====
insert into メーカー values(1,'TOYOTA');
insert into メーカー values(2,'NISSAN');
insert into メーカー values(3,'HONDA');

insert into 車種 values(1,1,'カローラ XXXX');
insert into 車種 values(1,2,'クラウン XXXX');
insert into 車種 values(2,1,'スカイライン XXXX');
insert into 車種 values(2,2,'マーチ');
insert into 車種 values(3,1,'アコード');

insert into 型名情報 values(1,1,'ABC-DEF-1234',2003,1600,150);
insert into 型名情報 values(1,1,'ABC-DEF-1240',2005,1600,160);
insert into 型名情報 values(1,2,'ABC-XYZ-1111',2005,2000,250);
insert into 型名情報 values(2,1,'EFGH-IJK-LMN-12',2002,2000,200);
insert into 型名情報 values(2,2,'HIJK-LMN-OPQ-20',2005,1600,120);
insert into 型名情報 values(3,1,'XY-ZABC-DE-12345',2003,2000,200);
=====ここまで=====

いよいよ検索です。
三つに分けた表から、メーカー名や車種名、年式といった情報を検索します。

=====検索SQL例=====
select x.メーカー名,y.車種名,年式,排気量,定価
from (メーカー as x
left join 車種 as y
on x.メーカーid=y.メーカーid)
left join 型名情報 as z
on y.メーカーid=z.メーカーid and y.車種id=z.車種id;
=====ここまで=====

少し複雑になってしまいました。
これをビューにして登録しておき、検索SQLは簡単に記述できるようにしてしまいます。

=====ビュー定義例1=====
create view 車検索
as
select x.メーカー名,y.車種名,年式,排気量,定価
from (メーカー as x
left join 車種 as y
on x.メーカーid=y.メーカーid)
left join 型名情報 as z
on y.メーカーid=z.メーカーid and y.車種id=z.車種id;
=====ここまで=====

このビューを利用して検索する場合、検索SQLは以下のように簡単に記述できます。

=====ビューを使った検索1=====
select * from 車検索;
=====ここまで=====

ビューで、特定のデータのみ見せる(他のデータは見せない)ことが可能です。
例えば上述のビューを「TOYOTA」の車種のみを見せるビューに変えてみます。

=====ビュー定義例2=====
drop view 車検索;
create view 車検索
as
select x.メーカー名,y.車種名,年式,排気量,定価
from (メーカー as x
left join 車種 as y
on x.メーカーid=y.メーカーid)
left join 型名情報 as z
on y.メーカーid=z.メーカーid and y.車種id=z.車種id
where x.メーカー名='TOYOTA';
=====ここまで=====

以下の検索(「ビューを使った検索1」と同じ)を行うと、今度は「TOYOTA」の車種しか見えなくなります。

=====ビューを使った検索2=====
select * from 車検索;
=====ここまで=====

このようにビューを使うと、特定のデータだけ見せたり、SQLを簡単にできるといったメリットがあります。

#1回答者です。

バイクは詳しくないので、自動車の例で説明します。

一つの表で、メーカー名や車種名などを管理すると、冗長な情報を管理することになってしまいます。

=====表定義例=====
create table メーカー
(メーカーid smallint primary key,
メーカー名 varchar(16));

create table 車種
(メーカーid smallint,
車種id smallint,
車種名 varchar(30),
primary key(メーカーid,車種id));

create table 型名情報
(メーカーid smallin...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング