sql >> データベース >  >> RDS >> Mysql

SQL-2つの外部キーを1つの主キーに左結合します

    私はよく、テーブルをそれ自体に結合したり、同じクエリで複数回結合したりするというアイデアに苦労している人をよく見かけます(ここにあるように)。習得したら、行間に多くの関係があるテーブル(互いにプレイする必要のあるチームのリストなど)で使用するのは優れたテクニックです。他の人が指摘しているように、2つのinner joinを使用する必要があります sこれを達成するために:

    select
        *
    from
        games g
        inner join teams t1 on
            g.teamid1 = t1.teamid
        inner join teams t2 on
            g.teamid2 = t2.teamid
    

    つまり、gamesの場合 テーブルは次のようになります:

    GameID    TeamID1    TeamID2
    ----------------------------
         1          1          3
         2          4          2
         3          2          1
    

    次の結果セットが表示されます:

    g.GameID    g.TeamID1    g.TeamID2    t1.TeamID    t1.Name    t2.TeamID    t2.Name
    ----------------------------------------------------------------------------------
           1            1            3            1    Lions              3    Bears
           2            4            2            4    Oh My              2    Tigers
           3            2            1            2    Tigers             1    Lions
    

    もちろん、selectでこれらの列のエイリアスを作成します 使いやすさのために、私が私だった場合のステートメント:

    select
        g.GameID,
        t1.Name as Team1,
        t2.Name as Team2
    from
        ...
    

    このようにして、t1を使用する代わりに、列に適切な名前を付けることができます。 およびt2 列は同じ名前を共有します。

    ここで、left joinについての混乱に対処します。 は。ほら、left join 最初の(または左の)テーブルからすべての行を取得し、結合条件のすべての行を2番目の(または右の)テーブルに一致させます。左側のテーブルの行については、nullを取得します rightのすべての列 テーブル。

    例を掘り下げて、誰かがnullを入れたとしましょう TeamID2の場合 何らかの理由で行の1つに。 TeamIDのチームも 4は以前は存在していましたが、現在は存在しません。

    GameID    TeamID1    TeamID2
    ----------------------------
         1          1          3
         2          4          2
         3          1       null
    

    それでは、left joinとは何かを見てみましょう。 クエリの観点から:

    select
        *
    from
        games g
        left join teams t1 on
            g.teamid1 = t1.teamid
        left join teams t2 on
            g.teamid2 = t2.teamid
    

    論理的には、これによりすべてのgamesが取得されます 、次にそれらをそれぞれのteamsに一致させます 。ただし、TeamID 存在しない場合は、nullを取得します s。次のようになります:

    g.GameID    g.TeamID1    g.TeamID2    t1.TeamID    t1.Name    t2.TeamID    t2.Name
    ----------------------------------------------------------------------------------
           1            1            3            1    Lions              3    Bears
           2            4            2         null    null               2    Tigers
           3            1         null            1    Lions           null    null
    

    したがって、left join のみ チームがオプションの場合は必要です。

    あなたの場合、inner joinを使用します テーブルを複数回結合します。これは非常に一般的な方法であり、かなり便利です。これにより、サブクエリ(特にMySQL)の落とし穴のいくつかを回避しながら、テーブル内の比較のためにテーブルからデータを取得できます。これは、何かの順序や関連する行を見つけようとするときに非常に役立ちます。

    とにかく、この非常にとりとめのない答えがどこかで誰かを助けることを願っています。



    1. 日、月、年を整数として指定してSQLServerで日付を作成する方法

    2. このテーブルで重複する連続した値を見つけるにはどうすればよいですか?

    3. 設計データベースへの先史時代および現代のアプローチ

    4. SQLServerでVARCHAR/CHARの代わりにNVARCHAR/NCHARを使用する必要があるのはいつですか?