2

私はしばらくこの問題に取り組んできましたが、どうすればよいかわかりません。

複数の結合を含む巨大な SQL クエリがあり、何十万ものレコードが得られます。これは完璧です。

次に、最初のテーブルに追加する必要がある別のテーブルに 200 個の奇数のレコードがあることに気付きました。

最初のテーブル:

フィールド1 フィールド2 フィールド3
ジョン・スミス 23 ボストン
モハメド・アリ 45 ニューヨーク
ステファニー・ジョンソン 15 ロサンゼルス

新しいテーブル

フィールド1 その他フィールド1 その他フィールド2
マーク・クーリー Null null

したがって、実際には、テーブル 2 の Field1 の値を最初のテーブルの「下」に追加するだけで済みます。最初のクエリで行ったすべての結合は、テーブル 2 にある値に対しても機能するはずです。

追加する列しかないため、ユニオンは機能しません。2 番目のテーブルの値から「Field2」と「Field3」を取得するには、最初のテーブルから同じクエリをコピーして貼り付ける必要があります。

私がそれをどのように見せたいかは次のとおりです。

フィールド1 フィールド2 フィールド3
ジョン・スミス 23 ボストン
モハメド・アリ 45 ニューヨーク
ステファニー・ジョンソン 15 ロサンゼルス
マーク・クーリー 65 ヒューストン

どうすればこれを行うことができますか?テーブルを「結合」したくありません。それらを結合したいのですが、1つの列だけで。

これが私が意味することの例です:

テーブル 1 は、次のようにして作成されました。

SELECT table.value1 as Field1, table2.value2 as Field2, table3.value3 as Field3 
FROM some_table as table
LEFT OUTER JOIN some_other_table as Table2 ON table.field = table2.field5
LEFT OUTER JOIN a_third_table as table3 ON table2.field2 = table3.field4

しかし今、より多くの Field1 値を持つ newTable があり、それらの値を最初のテーブルに追加する必要があります。

私はこれを試しました:

SELECT COALESCE(table.value1, NewTable.value) as Field1, table2.value2 as Field2,
table3.value3 as Field3               
FROM some_table as table
LEFT OUTER JOIN some_other_table as Table2 ON table.field = table2.field5
LEFT OUTER JOIN a_third_table as table3 ON table2.field2 = table3.field4, newTable

しかし、これは私に指数関数的な量の結果を与えています.それは私にさらに数百を与えるべきです.

4

2 に答える 2

0

@rhollyer と同じ考えで、あなたが求めているものを生成するスクリプトを次に示します。

DECLARE @Person TABLE
(
    PersonID int,
    DisplayName nvarchar(50)
)

DECLARE @PersonDetail TABLE
(
    PersonID int,
    Age int
)

DECLARE @PersonGeoInfo TABLE
(
    PersonID int,
    City nvarchar(200)
)

DECLARE @LostPersons TABLE
(
    LostPersonID int,
    DisplayName nvarchar(50),
    Irrelevant1 decimal,
    Irrelevant2 bit
)

INSERT INTO @Person (PersonID, DisplayName)
VALUES 
    (1, 'John Smith'),
    (2, 'Mohammed Ali'),
    (3, 'Stephanie Johnson')

INSERT INTO @PersonDetail(PersonID, Age)
VALUES
    (1, 23),
    (2, 45),
    (3, 15),
    (4, 65)

INSERT INTO @PersonGeoInfo(PersonID, City)
VALUES
    (1, 'Boston'),
    (2, 'New York'),
    (3, 'Los Angeles'),
    (4, 'Houston')

INSERT INTO @LostPersons(LostPersonID, DisplayName, Irrelevant1, Irrelevant2)
VALUES
    (4, 'Mark Khoury', 9.5, 1)

    DECLARE @Person TABLE
(
    PersonID int,
    DisplayName nvarchar(50)
)

DECLARE @PersonDetail TABLE
(
    PersonID int,
    Age int
)

DECLARE @PersonGeoInfo TABLE
(
    PersonID int,
    City nvarchar(200)
)

DECLARE @LostPersons TABLE
(
    LostPersonID int,
    DisplayName nvarchar(50),
    Irrelevant1 decimal,
    Irrelevant2 bit
)

INSERT INTO @Person (PersonID, DisplayName)
VALUES 
    (1, 'John Smith'),
    (2, 'Mohammed Ali'),
    (3, 'Stephanie Johnson')

INSERT INTO @PersonDetail(PersonID, Age)
VALUES
    (1, 23),
    (2, 45),
    (3, 15),
    (4, 65)

INSERT INTO @PersonGeoInfo(PersonID, City)
VALUES
    (1, 'Boston'),
    (2, 'New York'),
    (3, 'Los Angeles'),
    (4, 'Houston')

INSERT INTO @LostPersons(LostPersonID, DisplayName, Irrelevant1, Irrelevant2)
VALUES
    (4, 'Mark Khoury', 9.5, 1)

SELECT P.DisplayName AS Field1, PD.Age AS Field2, PGI.City AS Field3 
FROM (
    SELECT P.PersonID AS PersonID, P.DisplayName AS DisplayName FROM @Person P
    UNION
    SELECT LP.LostPersonID AS PersonID, LP.DisplayName AS DisplayName FROM @LostPersons LP) AS P        
LEFT OUTER JOIN @PersonDetail PD ON P.PersonID = PD.PersonID
LEFT OUTER JOIN @PersonGeoInfo PGI ON PD.PersonID = PGI.PersonID
于 2013-08-05T15:36:26.440 に答える