結合を利用する際に注意しなければならないのが、SELECT句やJOIN句で列名を指定する場合、重複する列名を識別するためにテーブル名を合わせて指定する必要がある、という点です。商品マスタとサブカテゴリマスタには、それぞれ「ProductSubcategoryID」という同名の列が存在しますが、テーブル名を指定していなければどちらの列か識別できないため、テーブルと列を合わせて指定する必要があります。単一に識別の可能な列名であればテーブル名を省略することも可能です。ただ、テーブルを指定しない場合、記述した列がどのテーブルに所属するか分かりづらいため、面倒でもテーブルを指定しておいた方がよいでしょう。
SQL Serverでは、JOIN句を利用せずにテーブルの結合を行うことが可能です。具体的には次のような形です。
SELECT Production.Product.ProductID, Production.Product.Name AS 商品名, Production.Product.ProductSubcategoryID, Production.ProductSubcategory.Name AS サブカテゴリ名 FROM Production.Product,Production.ProductSubcategory WHERE Production.Product.ProductSubcategoryID = Production.ProductSubcategory.ProductSubcategoryID
FROM句に結合を行うテーブルを列挙し、WHERE句で結合条件を指定しています。JOIN句を利用する場合よりも若干記述内容が減るのですが、WHERE句に通常の条件句指定を行った場合に結合条件との見分けが付きづらいため、JOIN句を利用した結合を勧めます。上記のような結合の記述が可能である点を覚えておきましょう。
内部結合として最後に、複数のテーブルを結合させた場合のサンプルを取り上げます。これまでのサンプルでは商品マスタ、サブカテゴリマスタを結合していましたが、ここにさらにカテゴリマスタを加えたいと思います。書き方としてはJOINに関連する句を加えるだけですが、結合条件に注意する必要があります。
SELECT Production.Product.ProductID, Production.Product.Name AS 商品名, Production.Product.ProductSubcategoryID, Production.ProductSubcategory.Name AS サブカテゴリ名, Production.ProductCategory.Name as カテゴリ名 FROM Production.Product INNER JOIN Production.ProductSubcategory ON Production.Product.ProductSubcategoryID = Production.ProductSubcategory.ProductSubcategoryID INNER JOIN Production.ProductCategory ON Production.ProductSubcategory.ProductCategoryID = Production.ProductCategory.ProductCategoryID 結果 ProductID 商品名 ProductSubcategoryID サブカテゴリ名 カテゴリ名 ----------- ---------------------------------------- -------------------- ------------------------------ ---------- 680 HL Road Frame - Black, 58 14 Road Frames Components 706 HL Road Frame - Red, 58 14 Road Frames Components 707 Sport-100 Helmet, Red 31 Helmets Accessories …中略… 999 Road-750 Black, 52 2 Road Bikes Bikes
複数のテーブルを利用した結合を行うことができました。ここまでテーブルの名前が連なると、さすがに見づらいので各テーブルにエイリアス(別名)を設定することによって、可読性をある程度保つことができます。
Copyright © ITmedia, Inc. All Rights Reserved.