OracleとSQL-SERVERの違い
システム開発なんていう仕事をしていると、
必ずDBなんてものを使用することになるのですが、
数あるDBMSでも2大DBといえば、OracleとSQL-SERVERでしょう。
でもこの2製品で、仕様にかなり相違があります。
まあ、管理方面での違いならまだいいのですが、
SQL構文自体での違いは影響が大きかったりします。
たとえば、
FLD_A(PK)
FLD_B
FLD_C
というフィールドを持つ、同一レイアウトの
TBL_A,TBL_Bという2つのテーブルがあったとして、
FLD_Aをキーにして、TBL_Bの値をTBL_Aに更新するSQLを書けと言われた場合、
ちょっとSQLをかじったことがある人なら
UPDATE TBL_A A
SET (A.FLD_B,A.FLD_C) = (SELECT B.FLD_B,B.FLD_C
FROM TBL_B B
WHERE B.FLD_A = A.FLD_A)
WHERE EXISTS (SELECT ‘X’
FROM TBL_B B
WHERE B.FLD_A = A.FLD_A)
というようなSQLを思いつくかと思います。
でもこれはOracleでは動くけと、SQL-SERVERでは動きません。
なぜか?理由は2つ。
1.SQL-SERVERではUPDATE句のエイリアスは指定できない。
2.SQL-SERVERでは「(列1,列2) =(値1,値2)」という条件
(行値式または行値構成子というらしい)の指定ができない
ではSQL-SERVERで、同じ動作をさせるにはどう書けばよいか?
一番簡単なのは、全フィールドに対して1つ1つ副問い合わせを書いてあげること。
でも更新フィールドがたくさんあった場合、そんな書き方はやってられない。
もっと簡単に書けないのか?実はあります。
UPDATE TBL_A
SET FLD_B = B.FLD_B
, FLD_C = B.FLD_C
FROM TBL_A A
, TBL_B B
WHERE A.FLD_A = B.FLD_A
これで同じ動作になります。Oracleの書き方よりもすごいすっきりしてしまいました。
標準SQL規格的には、前者の方が正しい書き方なのでしょうが、
SQL-SERVERの柔軟性には驚かされます。
まあ、個人的にはROWIDがあるというだけでOracleの勝ちですがw