MW211 EXIT

devlog
SQL/呉越同舟?
2011年08月30日
1対nの関係にある親子テーブルを結合して、子IDで親子両方の名称を取得する場合に
以下のようなSQL文となる(各IDは主キーとする)。
┌──────────────────────────────────────┐
│SELECT 親.名称,                                                             │
│       子.名称                                                              │
│    FROM 親,                                                                │
│         子                                                                 │
│    WHERE 親.親ID = 子.親ID                                                 │
│      AND 子.子ID = {子ID};                                                 │
└──────────────────────────────────────┘
一方、m対nの関係にある場合は上記SQL文では、複数のレコードが該当してしまう。
しかし、子IDに加えて親IDもわかっている場合には、
以下のようなSQL文で一意にレコードを取得できる。
┌──────────────────────────────────────┐
│SELECT 親.名称,                                                             │
│       子.名称                                                              │
│    FROM 親,                                                                │
│         子                                                                 │
│    WHERE 親.親ID = {親ID}                                                  │
│      AND 子.子ID = {子ID};                                                 │
└──────────────────────────────────────┘
全然別の一意情報を結合しただけだが、
1件×1件の直積は1件という単純な法則は結構使えるかも。
分類:SQL
内部結合と外部結合が複合する場合の罠
2011年08月29日
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表1,                                                               │
│         表2                                                                │
│    WHERE 表1.ID = 表2.ID;                                                  │
└──────────────────────────────────────┘
内部結合している表1と表2のうち、表1の方に表3を左外部結合したい場合
やってしまいがちなミス。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表1,                                                               │
│         表2                                                                │
│    LEFT JOIN 表3 ON 表1.ID = 表3.ID                                        │
│    WHERE 表1.ID = 表2.ID;                                                  │
└──────────────────────────────────────┘
以下が正しい。
表1と表2の結合結果に表3を結合するのではなく、
表1と表3の結合結果に表2を結合するのが正しい。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表1 LEFT JOIN 表3 ON 表1.ID = 表3.ID,                              │
│         表2                                                                │
│    WHERE 表1.ID = 表2.ID;                                                  │
└──────────────────────────────────────┘
表2に外部結合する場合は、前述でも順番的に問題ないので、
本来の仕様を勘違いしたままとなりやすい。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表1,                                                               │
│         表2                                                                │
│    LEFT JOIN 表3 ON 表2.ID = 表3.ID                                        │
│    WHERE 表1.ID = 表2.ID;                                                  │
└──────────────────────────────────────┘
分類:SQL
SQL/テーブル(表)の全レコード削除
2011年08月22日
┌──────────────────────────────────────┐
│DELETE FROM 表;                                                             │
└──────────────────────────────────────┘
上記のように、DELETE文を無条件(条件無し)で実行すれば、全レコードが削除される。

テーブルを空っぽにするという意味においては、以下も同じ。
┌──────────────────────────────────────┐
│TRUNCATE TABLE 表;                                                          │
└──────────────────────────────────────┘

ただし、動作としては、DELETE文はレコード数分実行されるのに対して
TRUNCATE文は、テーブル数分(つまり一回)実行されるイメージなので
後者がおすすめ。
分類:SQL
前へ 1 2 3 4 5 6 次へ