0

3 つのテーブル間で UNION を実行しています。分かりやすく説明すると、1 つのテーブルがメイン テーブルと見なされ、他の 2 つのテーブルがサブ テーブルと見なされます。2 つのサブテーブルには、ケースごとに常に同じ数のレコードがあります。したがって、これらの 3 つのテーブル間でユニオンを作成したかったのですが、このユニオンでは、メイン テーブルでフェッチされた列の情報を繰り返し、サブ テーブル 1 のすべての行が行に対応する 2 つのサブ テーブルの情報をリストしたいと考えています。サブテーブル2に。専門的な理由により実際のコードを掲載できないため、ここに私の実際のケースに対応する簡単な例を示します。Author (Author_ID、Author_FirstName、Author_LastName) というテーブルを考えてみましょう。このテーブルがメインテーブルになります。次に、Adresses (Adress_ID、Street_Coord、Author_ID) というテーブルがあるとします。これがサブテーブル 1 になります。次に、Cities (City_ID、City_Name、Author_ID) というテーブルについて考えます。著者 X は 2 つの都市に 2 つの住所を持っています。クエリを実行すると、完全に論理的な結果 R1 が得られますが、クエリを変更して結果 R2 を取得したいと考えています。クエリを変更して結果 R2 を取得する方法を教えてください。

SQL クエリ:

SELECT "Author"."Author_ID", "Author"."Author_FirstName", "Author.Author_LastName",
       TO_CHAR(NULL) AS "Street_Coord", TO_CHAR(NULL) AS "City_Name"
FROM "Author"
WHERE "Author"."Author_ID"='X'

UNION

SELECT TO_NUMBER(NULL) AS "Author_ID", TO_CHAR(NULL) AS "Author_FirstName", TO_CHAR(NULL) AS "Author_LastName", 
       "Adresses"."Street_Coord", TO_CHAR(NULL) AS "City_Name" 
FROM "Adresses"
WHERE "Adresses"."Author_ID"='X'

UNION

SELECT TO_NUMBER(NULL) AS "Author_ID", TO_CHAR(NULL) AS "Author_FirstName", TO_CHAR(NULL) AS "Author_LastName", 
       TO_CHAR(NULL) AS "Street_Coord", "Cities"."City_Name"
FROM "Cities"
WHERE "Cities"."Author_ID"='X'

結果 R1:

ID_AUTHOR | AUTHOR_FirstName | AUTHOR_LastName | Street_Coord   | City_Name       |
----------------------------------------------------------------------------------
X         |James             | Conor           | NULL           | NULL            |
----------------------------------------------------------------------------------
X         |NULL              | NULL            | 1245 rich st   | NULL            |
----------------------------------------------------------------------------------
X         |NULL              | NULL            | 154 music st   | NULL            |
----------------------------------------------------------------------------------
X         |NULL              | NULL            | NULL           | Madrid          |
----------------------------------------------------------------------------------
X         |NULL              | NULL            | NULL           | Barcelona       |
----------------------------------------------------------------------------------

結果 R2: この結果を得るのを手伝ってほしい:

ID_AUTHOR | AUTHOR_FirstName | AUTHOR_LastName | Street_Coord   | City_Name       |
----------------------------------------------------------------------------------
X         |James             | Conor           | 1245 rich st   | Madrid          |
----------------------------------------------------------------------------------
X         |James             | Conor           | 154 music st   | Barcelona       |
----------------------------------------------------------------------------------

どうもありがとう、ワラウド

4

2 に答える 2

0

最初に考えたのは、テーブルを一緒に結合したいということです。何かのようなもの:

SELECT "Author"."Author_ID", "Author"."Author_FirstName", "Author.Author_LastName",
       "Adresses"."Street_Coord", "Cities"."City_Name"
FROM "Author" join
     "Adresses"
     on Author.Author_id = Adresses.Author_id join
     Cities
     on Author.Author_id = Cities.Author_id 
WHERE "Author"."Author_ID"='X';

ただし、これは値のデカルト積を返し、2 行ではなく 4 行になります。目的は、さまざまなテーブルを「整列」させることのようです。その場合、このクエリはあなたが望むものに近くなります:

SELECT "Author"."Author_ID", "Author"."Author_FirstName", "Author.Author_LastName",
       "Adresses"."Street_Coord", "Cities"."City_Name"
FROM "Author" join
     (select a.*, rownum as seqnum from "Adresses" a
     ) Adresses
     on Author.Author_id = Adresses.Author_id join
     (select c.*, rownum as seqnum from Cities c
     ) Cities
     on Author.Author_id = Cities.Author_id and addresses.seqnum = cities.seqnum
WHERE "Author"."Author_ID"='X';

このアプローチの主な問題は、SQL テーブルが本質的に順序付けられていないことです。クエリが確実に機能するようにするには、これらを並べ替えるための列が必要です。たとえば、テーブルに自動インクリメント ID がある場合、各サブクエリはorder by id.

于 2013-05-23T00:35:44.880 に答える
0

UNION を実行するのではなく、 JOIN を実行したい場合:

SELECT "Author"."Author_ID", "Author"."Author_FirstName", "Author.Author_LastName", "Adresses"."Street_Coord", "Cities"."City_Name"
 FROM "Author"
 INNER JOIN "Adresses" ON "Author"."Author_ID"="Adresses"."Author_ID"
 INNER JOIN "Cities" ON "Author"."Author_ID"="Cities"."Author_ID"
 WHERE "Author"."Author_ID"='X'

確認していないので誤字脱字があるかもしれません...

また、「1245 rich st」を「Madrid」、「154 music st」および「Barcelona」と一致させるには、「Adresses」と「Cities」の間に追加の結合列が必要です。「City_ID」のようなもの。次に、それを INNER JOIN ... ON 句に追加します。

INNER JOIN "Cities" ON "Adresses"."City_ID"="Cities"."City_ID" AND "Author"."Author_ID"="Cities"."Author_ID"
于 2013-05-23T00:36:10.523 に答える