- PR -

SQL文について

1
投稿者投稿内容
mm
会議室デビュー日: 2004/11/02
投稿数: 13
投稿日時: 2004-11-10 16:07
いつもお世話になっております。

windowsXP、c#、sqlerver2000を使用して開発しています。

今、テーブルが2つあります。
[A1]テーブルの[K1]、[K2]、[K3]フィールドのそれぞれ右から2桁を結合した文字列と、
[A2]テーブルの[B1]フィールドがあり、
[A1]にあって、[A2]テーブルにないデータを、[A2]テーブルにINSERTしたいと思っています。

そこで、次のようなSQL文を作成しました。
-----------------------------------------------------------------
sql="INSERT INTO A2 (B1) SELECT "
+ "(RIGHT('00' + CAST(K1 AS varchar(2)), 2) + "
+ "RIGHT('00' + CAST(K2 AS varchar(2)), 2) + "
+ "RIGHT('00' + CAST(K3 AS varchar(2)), 2)) as aa "
+ "FROM A1 LEFT JOIN A2 ON B1=aa WHERE B1 IS NULL";
-----------------------------------------------------------------

これを実行すると、次のようなエラーが出ます。
-----------------------------------------------------------------
System.Data.SqlClient.SqlException: 列名 'aa' は無効です。
-----------------------------------------------------------------

ここで質問なのですが、
[K1]、[K2]、[K3]を「+」で結合してaaという名前にしようと思ったのですが
この定義はできないのでしょうか?
Webを見ると、フィールドのエイリアス名は設定できるように思えるのですが・・・。


ちなみに、上のSQL文を次のように書き換えると、正常に動作します。
ただ、見づらい気がするのですが。
-----------------------------------------------------------------
sql="INSERT INTO A2 (B1) SELECT "
+ "(RIGHT('00' + CAST(K1 AS varchar(2)), 2) + "
+ "RIGHT('00' + CAST(K2 AS varchar(2)), 2) + "
+ "RIGHT('00' + CAST(K3 AS varchar(2)), 2)) "
+ "FROM A1 LEFT JOIN A2 ON "
+ "B1=(RIGHT('00' + CAST(K1 AS varchar(2)), 2) + "
+ "RIGHT('00' + CAST(K2 AS varchar(2)), 2) + "
+ "RIGHT('00' + CAST(K3 AS varchar(2)), 2)) "
+ "WHERE B1 IS NULL";
-----------------------------------------------------------------

よろしくご教授をお願い致します。
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2004-11-10 16:54
SQLServerの環境がないので他のRDBで確認したためご参考になるか心配なのですが、
aaを持ったテーブルA3を定義し、A3とA2を外部結合したテーブルをA4と定義して、
A4の全件を挿入して希望の結果が得られています。何かのご参考になれば幸いです。

sql="INSERT INTO A2 (B1) SELECT aa FROM "
+ "(SELECT aa FROM (SELECT RIGHT('00' + CAST(K1 AS varchar(2)), 2) + "
+ "RIGHT('00' + CAST(K2 AS varchar(2)), 2) + "
+ "RIGHT('00' + CAST(K3 AS varchar(2)), 2)) as aa "
+ "FROM A1) A3 LEFT JOIN A2 ON B1=aa WHERE B1 IS NULL) A4";
あら
常連さん
会議室デビュー日: 2004/03/27
投稿数: 24
投稿日時: 2004-11-10 17:24
SQLではカラム名のエイリアスはwhere句では使えないとあるので、
(order by とhavingyのみ可能と)
joinでも同じ事だろうと思います。
とりあえず、そこでは使えないと言う情報です。

でも確かに同じ事書かないといけないのもいやですね。
自分ではちょっと実力不足なので、他の識者を待つと言う事で...

-------
# 間違ってgroup by句でも可能と書いていたので訂正


[ メッセージ編集済み 編集者: あら 編集日時 2004-11-10 17:49 ]
あら
常連さん
会議室デビュー日: 2004/03/27
投稿数: 24
投稿日時: 2004-11-10 18:11
ごめんなさい。
自分の直前の書き込みでさっき訂正したにも関わらず、
まだ間違っている部分があったので、追加でまた書き込みします。

MS SQLServe2000のドキュメントみたら、カラムエイリアスは
order by句で使用できるとあるので、それ以外ではできないようです。

---
ちなみに本筋と離れた話になってしまうのですが、

PostgreSQL(7.4.6)は(output_nameと書いてありますが)order by句と
group by句で使用できる。

MySQL(4.1.1)では、order by 節または having 節とともに使用できる。

と記述があって、SQL標準のDBなら同じようなものかと思っていたけど、
微妙〜〜 に仕様が違うのですね。
知らなかった...
mm
会議室デビュー日: 2004/11/02
投稿数: 13
投稿日時: 2004-11-10 18:16
お返事ありがとうございます。

教えていただいたように、テーブルを定義してさらにそのテーブルを定義して・・・
という方法で試してみましたが、sqlサーバ上ではエラーになってしまいました。

もし、他にいい方法がありましたら、教えてください。

ありがとうございました。
ごー
ベテラン
会議室デビュー日: 2003/08/29
投稿数: 51
お住まい・勤務地: いるかホテル
投稿日時: 2004-11-10 18:34
こんばんは。個人的には存在しないデータを取得したいときはExists句をお勧めします。
以下のような感じになります。※もしかしたらコンパイルエラーになるかも
詳しくはヘルプなどにのっていると思うのでよかったら補足して使ってみてください。



insert into [A2テーブル]
Select *
From [A2テーブル]
Where Not Exists
(
Select *
From [A1テーブル]
Where right(K1,2) + right(K2,2) + right(K3,2) = B1
)

_________________
倉廩満ちて礼節を知る



[ メッセージ編集済み 編集者: ごー 編集日時 2004-11-10 18:36 ]
1

スキルアップ/キャリアアップ(JOB@IT)