質問

非常に長い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

別の可能な解決策は次のとおりです。

  1. (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

  2. 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に感謝

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top