質問
非常に長いSQLクエリの後、次の形式の結果が得られます。
col1 | col2 | col3 | col4
------+------+------+-----
1234 | 1 | aaaa | bbbb
2378 | 0 | aaaa | bbbb
9753 | 1 | cccc | uuuu
1234 | 0 | iiii | yyyy
2378 | 1 | iiii | yyyy
9753 | 1 | tttt | mmmm
しかし、この方法では必要ありません。 3番目と4番目の列で group を使用する必要があるこの結果に対して別のSQLステートメントを実行する必要があります。 つまり、次のように、2行が1行になります。
col1 | col2 | col3 | col4 | col5 | col6
-----+------+------+------+------+-----
1234 | 1 | 2378 | 0 | aaaa | bbbb
1234 | 1 | 2378 | 0 | aaaa | bbbb
9753 | 1 | null | null | cccc | uuuu
1234 | 0 | 2378 | 1 | iiii | yyyy
9753 | 1 | null | null | tttt | mmmm
解決
クエリから列をマッピングする構造を追加する2つのテーブル(一時的かどうか、要件とSQLエンジンによって異なります)を作成することで、この問題を解決できます。
例:
CREATE TABLE TableA (
Col1 int,
Col2 bit,
Col3 varchar(4),
Col4 varchar(4)
)
CREATE TABLE TableB (
Col1 int,
Col2 bit,
Col3 varchar(4),
Col4 varchar(4)
)
これは、提示した出力データに基づく構造の例にすぎないことに注意してください。
これら2つのテーブルを作成したら、クエリから各テーブルにデータを挿入する必要があります。
追加: 同じクエリを2回実行する必要はありません。 1回実行し、データをTableAに配置してから、TableAでSELECTを実行し、TableBにデータを配置します。それは多くの時間を節約します。
最後のステップは、列Col3およびCol4にJOINを指定して、TableAおよびTableBでクエリを実行することです。このようなもの:
SELECT A.Col1, A.Col2, B.Col1, B.Col2, COALESCE(A.Col3, B.Col3), COALESCE(A.Col4, B.Col4)
FROM TableA A INNER JOIN TableB B ON A.Col3 = B.Col3 AND A.Col4 = B.Col4
これが役立つことを願っています。
また、このソリューションには1つの大きな欠点があることに注意してください:
元のクエリで列の数またはそのデータ型を変更する場合は、テーブル定義も更新する必要があります。 これに対する可能な解決策は動的SQLを使用することですが、通常は推奨されません。
編集後(出力データに追加のNULLを指定しました):
NULL値を保持する場合は、別の結合を使用する必要があります。例:LEFT OUTER JOIN
別の可能な解決策は次のとおりです。
-
(SELECT * FROM dbo.Test)を長いクエリに置き換えるだけです。 ただし、これによりクエリが2回実行されます。
SELECT A. *、B。* FROM(SELECT * FROM dbo.Test)A LEFT OUTER JOIN(SELECT * FROM dbo.Test)B ON A.Col3 = B.Col3 AND A.Col4 = B.Col4 AND A.Col1 <!> lt; <!> gt; B.Col1およびA.Col2 <!> lt; <!> gt; B.Col2
-
SQL 2005を使用している場合、CROSS APPLY演算子を使用できます。
他の解決策もあるかもしれませんが、使用するSQLエンジンとデータベースに対する権限についてより詳しく説明する必要があります。
他のヒント
うーん、
結果を一時テーブルに投げ入れます。 次に
select
a.col1,
a.col2,
b.col1,
b.col2,
coalesce(a.col3, b.col3) as col5,
coalesce(a.col4,b.col4) as col6
from #tmp a
outer join #tmp b
on a.col3 = b.col3 and a.col4 = b.col4
where a.col2 = 0 and b.col2 = 1
これはもちろん、col2がペアのどの部分を持っているかを示すインジケーターであると仮定しています。
iは、 @Wodzu の最初のソリューションに基づいて、正しいソリューションを見つけました。
まず、結果を含む一時ビューを作成します。
tmpとして ( -私の非常に長いSQL文... )
次に、2つあるため選択を行います。このようにして、クエリは1回だけ呼び出されます。
条件からa。**、b。**をtmp a内部結合tmp bから選択します。
Wodzuに感謝