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

共通フィールドを持たない2つのテーブルを組み合わせる

    実際に何をするかに応じて、これを行うにはいくつかの方法があります。 欲しいです。共通の列がない場合は、共通の列を導入するか、製品を入手するかを決定する必要があります。

    2つのテーブルがあるとしましょう:

    parts:              custs:
    +----+----------+   +-----+------+
    | id | desc     |   |  id | name |
    +----+----------+   +-----+------+
    |  1 | Sprocket |   | 100 | Bob  |
    |  2 | Flange   |   | 101 | Paul |
    +----+----------+   +-----+------+
    

    持っている可能性が高いので、実際の列を忘れてください この場合、顧客/注文/部品の関係。これらの列を使用して、その方法を説明しました。

    デカルト積は、最初のテーブルのすべての行を2番目のテーブルのすべての行と一致させます:

    > select * from parts, custs;
          id desc     id  name
          -- ----     --- ----
          1  Sprocket 101 Bob
          1  Sprocket 102 Paul
          2  Flange   101 Bob
          2  Flange   102 Paul
    

    1000個の部品と100個の顧客が、大量の重複情報を含む100,000行になるため、これはおそらくあなたが望むことではありません。

    または、ユニオンを使用してデータを出力することもできますが、並べて表示することはできません(テーブルの列に互換性を持たせるか、選択で強制することにより、2つの選択間で列タイプに互換性があることを確認する必要があります):

    > select id as pid, desc, null as cid, null as name from parts
      union
      select null as pid, null as desc, id as cid, name from custs;
        pid desc     cid name
        --- ----     --- ----
                     101 Bob 
                     102 Paul
        1   Sprocket
        2   Flange
    

    一部のデータベースでは、rowid / rownum列またはpseudo-columnを使用して、次のようにレコードを並べて照合できます。

    id desc     id  name
    -- ----     --- ----
    1  Sprocket 101 Bob
    2  Flange   101 Bob
    

    コードは次のようになります:

    select a.id, a.desc, b.id, b.name
    from parts a, custs b
    where a.rownum = b.rownum;
    

    それはまだのようです デカルト積ですが、where 句は、行を組み合わせて結果を形成する方法を制限します(したがって、実際にはデカルト積ではありません)。

    これは私の選択したDBMSの制限の1つであるため、このSQLについてはテストしていません。当然のことながら、適切に考え抜かれたスキーマでSQLが必要になるとは思いません。 SQLはデータを生成する順序を保証しないため、特定のがない限り、クエリを実行するたびに一致が変更される可能性があります。 関係またはorder by 条項。

    理想的なことは、関係が何であるかを指定する列を両方のテーブルに追加することだと思います。実際の関係がない場合は、SQLと並べて配置しようとしてもビジネスはおそらくありません。

    レポートまたはウェブページに並べて表示したい場合(2つの例)、それを行うための適切なツールは、レポートまたはウェブページを生成するものと、2つの独立したを組み合わせたものです。 2つの無関係なテーブルを取得するためのSQLクエリ。たとえば、BIRT(またはCrystalまたはJasper)の2列のグリッドにはそれぞれ個別のデータテーブルがあり、HTMLの2列のテーブル(またはCSS)にはそれぞれ個別のデータテーブルがあります。



    1. MySQLでのMID()関数のしくみ

    2. UTF8文字列のMD5ハッシュを計算します

    3. MySQLサーバーのタイムゾーンを変更する方法

    4. DistinctとGroupByのパフォーマンスが異なる場合はどうなりますか?