最大の難関“表の結合”は関連付けに注目するさらっと覚えるSQL&T-SQL入門(6)(2/3 ページ)

» 2007年07月25日 00時00分 公開
[石橋潤一株式会社システムインテグレータ]

内部結合を利用する際の注意点

 結合を利用する際に注意しなければならないのが、SELECT句やJOIN句で列名を指定する場合、重複する列名を識別するためにテーブル名を合わせて指定する必要がある、という点です。商品マスタとサブカテゴリマスタには、それぞれ「ProductSubcategoryID」という同名の列が存在しますが、テーブル名を指定していなければどちらの列か識別できないため、テーブルと列を合わせて指定する必要があります。単一に識別の可能な列名であればテーブル名を省略することも可能です。ただ、テーブルを指定しない場合、記述した列がどのテーブルに所属するか分かりづらいため、面倒でもテーブルを指定しておいた方がよいでしょう。

JOIN句を使用しない内部結合

 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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。