共通のフィールドを持たない2つのdbテーブルを組み合わせる方法を学びたいです。UNIONをチェックしましたが、MSDNによると:
以下は、UNIONを使用して2つのクエリの結果セットを組み合わせるための基本的なルールです。
- 列の数と順序は、すべてのクエリで同じである必要があります。
- データ型は互換性がなければなりません。
しかし、私には共通の分野はまったくありません。私が欲しいのは、ビューのようにそれらを1つのテーブルに結合することです。
だから私は何をすべきですか?
共通のフィールドを持たない2つのdbテーブルを組み合わせる方法を学びたいです。UNIONをチェックしましたが、MSDNによると:
以下は、UNIONを使用して2つのクエリの結果セットを組み合わせるための基本的なルールです。
- 列の数と順序は、すべてのクエリで同じである必要があります。
- データ型は互換性がなければなりません。
しかし、私には共通の分野はまったくありません。私が欲しいのは、ビューのようにそれらを1つのテーブルに結合することです。
だから私は何をすべきですか?
これを行うには、本当に必要なものに応じて、いくつかの方法があります。共通の列がない場合は、共通の列を導入するか、製品を入手するかを決定する必要があります。
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)にはそれぞれ個別のデータテーブルがあります。
これは非常に奇妙な要求であり、実際のアプリケーションでは絶対にやりたくないことですが、純粋に学術的な観点からは、興味深い課題です。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」の回答としてのみ提供します。
SELECT *
FROM table1, table2
これにより、table1のすべての行がtable2(デカルト積)と結合され、すべての列が返されます。
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;
試す:
select * from table 1 left join table2 as t on 1 = 1;
これにより、両方のテーブルのすべての列が表示されます。
テーブルに共通のフィールドがない場合、意味のあるビューでデータを組み合わせる方法はありません。両方のテーブルからの重複データを含むビューが表示される可能性が高くなります。
2つのテーブルの意味のある/有用なビューを取得するには、通常、各テーブルから識別フィールドを決定する必要があります。このフィールドは、JOINのON句で使用できます。
あなたの見解では:
SELECT T1.*, T2.* FROM T1 JOIN T2 ON T1.IDFIELD1 = T2.IDFIELD2
「共通」のフィールドはないとおっしゃっていますが、識別フィールドの名前が同じでなくても、データ型が同じでもない場合でも、変換/キャスト関数を使用して何らかの方法でフィールドを結合できます。
シンプルなアプローチを使ってみませんか
SELECT distinct *
FROM
SUPPLIER full join
CUSTOMER on (
CUSTOMER.OID = SUPPLIER.OID
)
両方のテーブルのすべての列が表示され、顧客が3つのレコードを持ち、サプライヤーが2つのレコードを持っている場合、サプライヤーはすべての列にNULLを表示します。
Select
DISTINCT t1.col,t2col
From table1 t1, table2 t2
OR
Select
DISTINCT t1.col,t2col
From table1 t1
cross JOIN table2 t2
その抱擁データの場合、それは長い時間がかかります..
SELECT t1.col table1col, t2.col table2col
FROM table1 t1
JOIN table2 t2 on t1.table1Id = x and t2.table2Id = y
select * from this_table;
select distinct person from this_table
union select address as location from that_table
drop wrong_table from this_database;
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
関連のないテーブルの結合
デモ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;
このクエリを試してください:
共通の列がない2つのテーブルを結合します。
SELECT *
FROM table1
UNION
SELECT *
FROM table2
ORDER BY orderby ASC