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

生花店向け販売管理ソフトウェア FlowerA

生花店専用ソフトの最安値に挑戦しました!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です