2011/08/23

SQLServer DateTime型のフィールドの値の日付を取得

SQLServer DateTime型のフィールドの値の日付を取得するとき。SQLServerではDATE_FORMAT()などが使えないので以下のようにするととれる

select CONVERT(NVARCHAR, TBL_AAA.FIELD_DATETIME, 111) from TBL_AAAA


3つ目の引数で、取得する形式を指定。'111'を指定した場合、'yyyy/mm/dd' の形式で取得できる。




2011/08/08

オートナンバーのフィールドの値を取得

オートナンバーになっているフィールドの値をINSERT直後に取得したい場合

insert into TBL_AAAA(field_a, field_b, field_c) values ( 123, 564, 'sss' ) select SCOPE_IDENTITY() as new_id


とすれば、new_id として値を取得できる。



2011/07/21

外部結合で参照列が複数あるSQL

テーブルAには

ID | NAME
001 | 太郎
002 | 次郎
003 | 三郎


がはいっていて、

テーブルBには、テーブルAのIDを参照して

ID | GROUP_NAME | FRIEND_ID
001 | さくら | 003
002 | ぽぷら | 002
003 | いちご | 001


のようにはいっている。

テーブルBからセレクトするとき、テーブルAを結合して、IDとFRIEND_IDの二つの列に対応するNAMEと取得したい場合いかのように書く

select
テーブルB.ID, テーブルB.GROUP_NAME,テーブルB.FRIEND_ID,T1.NAME as HoninName, T2.NAME as FriendName
from テーブルB
left join
テーブルA as T1
on T1.NAME = テーブルB.ID
left join
テーブルA as T2
on T2.Name = テーブルB.FRIEND_ID




2011/07/04

副問合せを使った削除

本来であれば、

DELETE from TABLE_WRK_GRP WHERE WORKER_ID = '103066' and GROUP_CODE = 2365


として、TABLE_WRK_GRPからデータを削除したいのに、すぐに入手できるデータがWORKER_IDと別テーブル、TABLE_GRPで GROUP_CODE と関連付けられている NAME しか分からない場合、
いちいち、TABLE_GRP から NAME でセレクトしGROUP_CODE を取得してから上記のSQLを書くと手間になる。

そのときは副問合せをつかって、そのselect作業もおなじSQL文で実行できる。

DELETE from TTABLEBL_WRK_GRP WHERE WORKER_ID = '103066' and GROUP_CODE in ( select GROUP_CODE from TABLE_GRP where NAME = 'abcdef' )




2011/07/01

データ型 text と varchar は equal to 演算子では互換性がありません。

SQL Server のテーブルで、text型を使って列を定義したとき以下ののSQL文がエラーになる

select * from TABLE_A where field_a = 'aaa'


エラーの内容は以下のとおり

データ型 text と varchar は equal to 演算子では互換性がありません。


対策:

1.DBのデータ型を text から varchar()、nvarchar() に変更する。

2.SQL文で以下のように、データの型変換を記述する。(DBのデータ型を変更できないときはこれしかない)

select * from TABLE_A where CONVERT(nvarchar(20),field_a)= 'aaa'


もしくは、

select * from TABLE_A where CAST(field_a as nvarchar(20)) = 'aaa'