67

共通のフィールドを持たない2つのdbテーブルを組み合わせる方法を学びたいです。UNIONをチェックしましたが、MSDNによると:

以下は、UNIONを使用して2つのクエリの結果セットを組み合わせるための基本的なルールです。

  1. 列の数と順序は、すべてのクエリで同じである必要があります。
  2. データ型は互換性がなければなりません。

しかし、私には共通の分野はまったくありません。私が欲しいのは、ビューのようにそれらを1つのテーブルに結合することです。

だから私は何をすべきですか?

4

14 に答える 14

131

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

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列または疑似列を使用して、次のようにレコードを並べて照合できます。

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と並べて配置しようとしてもビジネスはおそらくありません。

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

于 2009-07-29T05:48:09.073 に答える
26

これは非常に奇妙な要求であり、実際のアプリケーションでは絶対にやりたくないことですが、純粋に学術的な観点からは、興味深い課題です。SQL Server 2005では、一般的なテーブル式とrow_number()関数を使用して、次のように結合できます。

with OrderedFoos as (
    select row_number() over (order by FooName) RowNum, *
    from Foos (nolock)
),
OrderedBars as (
    select row_number() over (order by BarName) RowNum, *
    from Bars (nolock)
)
select * 
from OrderedFoos f
    full outer join OrderedBars u on u.RowNum = f.RowNum

これは機能しますが、それは非常にばかげており、私は本当にお勧めしないので、「コミュニティwiki」の回答としてのみ提供します。

于 2009-07-29T05:11:52.923 に答える
11
SELECT *
FROM table1, table2

これにより、table1のすべての行がtable2(デカルト積)と結合され、すべての列が返されます。

于 2009-07-29T05:04:38.897 に答える
5
select 
    status_id, 
    status, 
    null as path, 
    null as Description 
from 
    zmw_t_status

union
select 
    null, 
    null, 
    path as cid, 
    Description from zmw_t_path;
于 2014-05-22T09:54:02.920 に答える
5

試す:

select * from table 1 left join table2 as t on 1 = 1;

これにより、両方のテーブルのすべての列が表示されます。

于 2017-09-01T10:45:52.297 に答える
3

テーブルに共通のフィールドがない場合、意味のあるビューでデータを組み合わせる方法はありません。両方のテーブルからの重複データを含むビューが表示される可能性が高くなります。

于 2009-07-29T05:03:15.670 に答える
2

2つのテーブルの意味のある/有用なビューを取得するには、通常、各テーブルから識別フィールドを決定する必要があります。このフィールドは、JOINのON句で使用できます。

あなたの見解では:

SELECT T1.*, T2.* FROM T1 JOIN T2 ON T1.IDFIELD1 = T2.IDFIELD2

「共通」のフィールドはないとおっしゃっていますが、識別フィールドの名前が同じでなくても、データ型が同じでもない場合でも、変換/キャスト関数を使用して何らかの方法でフィールドを結合できます。

于 2009-07-29T05:10:31.647 に答える
2

シンプルなアプローチを使ってみませんか

    SELECT distinct *
    FROM 
    SUPPLIER full join 
    CUSTOMER on (
        CUSTOMER.OID = SUPPLIER.OID
    )

両方のテーブルのすべての列が表示され、顧客が3つのレコードを持ち、サプライヤーが2つのレコードを持っている場合、サプライヤーはすべての列にNULLを表示します。

于 2012-10-02T23:28:03.817 に答える
2
Select 
DISTINCT  t1.col,t2col
From table1 t1, table2 t2

OR

Select 
DISTINCT  t1.col,t2col
From table1 t1 
cross JOIN  table2 t2

その抱擁データの場合、それは長い時間がかかります..

于 2016-09-01T08:18:57.127 に答える
1
SELECT t1.col table1col, t2.col table2col
FROM table1 t1 
JOIN table2 t2 on t1.table1Id = x and t2.table2Id = y
于 2016-04-01T14:13:23.100 に答える
0
select * from this_table;

select distinct person from this_table

union select address as location from that_table 

drop wrong_table from this_database;
于 2014-12-02T02:09:18.847 に答える
0

3つの選択されたステートメントでこれを行う必要がある場合は非常に困難です

私はそこで提案されたすべてのテクニックを試しましたが、それは無駄です

以下のスクリプトを参照してください。別の解決策がある場合はアドバイスしてください

   select distinct x.best_Achiver_ever,y.Today_best_Achiver ,z.Most_Violator from 

    (SELECT  Top(4) ROW_NUMBER() over (order by tl.username)  AS conj, tl. 
     [username] + '-->' + str(count(*)) as best_Achiver_ever 
    FROM[TiketFollowup].[dbo].N_FCR_Tikect_Log_Archive tl
     group by tl.username
     order by count(*) desc) x
      left outer join 

(SELECT 
Top(4) ROW_NUMBER() over (order by tl.username)  as conj, tl.[username] + '-->' + str(count(*)) as Today_best_Achiver
FROM[TiketFollowup].[dbo].[N_FCR_Tikect_Log] tl
where convert(date, tl.stamp, 121) = convert(date,GETDATE(),121)
group by tl.username
order by count(*) desc) y 
on x.conj=y.conj

 left outer join 

(
select  ROW_NUMBER() over (order by count(*)) as conj,username+ '--> ' + str( count(dbo.IsViolated(stamp))) as Most_Violator from N_FCR_Ticket
where dbo.IsViolated(stamp) = 'violated' and  convert(date,stamp, 121) < convert(date,GETDATE(),121)
group by username
order by count(*) desc) z
on x.conj = z.conj
于 2019-02-20T13:43:26.510 に答える
0

関連のないテーブルの結合

ここに画像の説明を入力してください

デモSQLスクリプト

IF OBJECT_ID('Tempdb..#T1') IS NOT NULL  DROP TABLE #T1;

CREATE TABLE #T1 (T1_Name VARCHAR(75));

INSERT INTO #T1 (T1_Name) VALUES ('Animal'),('Bat'),('Cat'),('Duet');

SELECT * FROM #T1;

IF OBJECT_ID('Tempdb..#T2') IS NOT NULL  DROP TABLE #T2;

CREATE TABLE #T2 (T2_Class VARCHAR(10));

INSERT INTO #T2 (T2_Class) VALUES ('Z'),('T'),('H'); 

SELECT * FROM #T2;

関連のないテーブルを結合するために、以下のようなシリアル番号の一般的な結合列を1つ紹介します。

SQLスクリプト

SELECT T1.T1_Name,ISNULL(T2.T2_Class,'') AS T2_Class FROM
( SELECT T1_Name,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS S_NO FROM #T1) T1
LEFT JOIN
( SELECT T2_Class,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS S_NO FROM #T2) T2
ON t1.S_NO=T2.S_NO;
于 2020-01-18T06:40:22.730 に答える
-2

このクエリを試してください:

共通の列がない2つのテーブルを結合します。

SELECT * 
FROM table1 

UNION 

SELECT * 
FROM table2  
ORDER BY orderby ASC
于 2015-01-28T12:29:29.060 に答える