ExcelでSQLを使う

エクセルでSQLを使う必須の関数を紹介しします。

ExcelでSQLを使う-016: SQL 複数の表からの検索

動物のお医者さん 第8章

 狂犬病予防接種をして歩く”旅の獣医”にあこがれ、町の人の信頼のもとに成り立つ開業医を夢見る博士課程のハムテルと二階堂。理想の獣医師像を求めて修行に出た二人を待ち受けていた現実とは?一方、清原たちの開業のしらせを聞いて、あせるおばあさんがめぐらせた画策とは?さまざまな動物たちと個性的な人々が織りなしてきた北の大地の物語もいよいよ終幕。かって予告されたとおり、獣医師の道をつき進むハムテルの胸に去来するものは何であろうか?(同書の帯より)

◇◇◇◇◇

複数の表からの検索

 同じデータベースに属していれば、SELECT文を使って複数の表からデータを検索することができます。


 SELECT <列名の並び> FROM <表1>,<表2> WHERE [<表1>].<列> = [<表2>].<列>


 例えば、次のような表<商品一覧>と表<商品枝番情報>がありるとします。この2つの表は、[商品一覧].[ID]と[商品枝番情報].[商品一覧_ID]と結合するための列を持っています。この場合、SELECT文で2つの表からデータを検索することができます。 

    --------------------------------------------------
        商品一覧    商品枝番情報
    --------------------------------------------------
        
ID             ID
         品名          
商品一覧_ID
         綴り           区分
         科目           枝番
         品種           仕入単価
                        販売単価
    --------------------------------------------------

 

 次は、紳士靴に関する共通の情報が表<商品一覧>に、23cm、24cm、25cmというサイズごとの仕入単価や販売単価が表<商品枝番情報>に登録されている場合に、サイズ23cmの紳士靴の<品名><仕入単価><販売単価>を検索する例です。


 SELECT 商品一覧.品名,商品枝番情報.仕入単価, 商品枝番情報.販売単価 FROM 商品一覧, 商品枝番情報WHERE 商品一覧.id=商品枝番情報.商品一覧_ID AND 商品枝番情報.枝番='23cm'

 このように長いSQL文は、マクロに書く前に一度〔イミディエイトウインドウ〕でテストすることをお勧めします。私は、メモ帳で次のようにSELECT節、FROM節、WHERE節毎に行を変えて書いてからテストしました。


? DSelect("SELECT
                    [商品一覧$A1:E100].品名,
                    [商品枝番情報$A1:F100].仕入単価,
                    [商品枝番情報$A1:F100].販売単価
                FROM
                    [商品一覧$A1:E100],
                    [商品枝番情報$A1:F100]
                WHERE
                    [商品一覧$A1:E100].ID=[商品枝番情報$A1:F100].商品一覧_ID
                AND
                    [商品枝番情報$A1:F100].枝番='23cm'",,chr(13))
1;紳士靴A;5000;6750
2;紳士靴B;5500;7430

◇◇◇◇◇

 

DSelect関数の結果を表に出力する

  

 8回に渡るハスキー流「SQLリファレンス」も本稿で終わります。最後に、上記のDSelect関数を実行して新しい表に出力するマクロを紹介しておきます。

 

表示がズレています。

この不具合は、2019/03/22に解決しました。

記事№017を参照してください。

 

 マクロは、1行でも書けます。しかし、それでは、他のユーザーがアレンジして再利用うことは不可能です。多少、面倒でも《誰でも、目で見たらわかるマクロ》を書くことを勧めておきます。

 

Option Explicit

'
' 《例》
'
' SELECT
'         [商品一覧$A1:E100].品名,
'         [商品枝番情報$A1:F100].仕入単価,
'         [商品枝番情報$A1:F100].販売単価
'     FROM
'         [商品一覧$A1:E100],
'         [商品枝番情報$A1:F100]
'     WHERE
'         [商品一覧$A1:E100].ID = [商品枝番情報$A1:F100].商品一覧_ID
'         AND
'         [商品枝番情報$A1:F100].枝番='23cm'",,chr(13))
'
Sub 商品情報検索して表に出力する()
    Dim strSQL      As String
    Dim strSelect  As String
    Dim strFrom    As String
    Dim strWhere  As String
   
    strSelect = "SELECT " & _
                     "[商品一覧$A1:E100].品名," & _
                     "[商品枝番情報$A1:F100].仕入単価, " & _
                     "[商品枝番情報$A1:F100].販売単価"
    strFrom = " FROM " & _
                   "[商品一覧$A1:E100]," & _
                   "[商品枝番情報$A1:F100]"
    strWhere = " WHERE " & _
                     "[商品一覧$A1:E100].ID = [商品枝番情報$A1:F100].商品一覧_ID" & _
                     " AND  [商品枝番情報$A1:F100].枝番='23cm'"
    strSQL = strSelect & strFrom & strWhere
    ' ※※※※※※※※
    '  表に出力する
    '※※※※※※※※
    Call SQLWriter(strSQL, "New")

End Sub