1

2 つの項目の間の値を与えるテーブルがあります。表には次の列があります。

itemA | itemB | value
1     | 2     | 125
1     | 3     | 56
3     | 2     | 78
2     | 4     | 24
4     | 1     | 994
3     | 4     | 7

対称値が繰り返されていないことを強調します。たとえば、このデータはすでに itemA = 1 および itemB = 2 で保存されているため、itemA = 2 および itemB = 1 の行があり、値 = 125 です。

ここで、項目 1、2、および 3 の間のすべての値を取得したいと思いますが、対称値も取得します。SQL結果セットのようなもの:

itemA | itemB | value
1     | 2     | 125
1     | 3     | 56
2     | 1     | 125
2     | 3     | 78
3     | 1     | 56
3     | 2     | 78

次のSQLクエリでそれを取得することに成功しました:

select itemA as iA, itemB as iB, value 
from table 
where itemA in (1,2,3) 
    and itemB in (1,2,3) 
union all 
select itemB as iA, itemA as iB, value 
from table 
where itemA in (1,2,3) 
    and itemB in (1,2,3) 
order by iA, iB;

ただし、UNION 演算子はパフォーマンス キラーであり、このテーブルには実際には 1 億行を超える行があると言われています。しかし、何時間ものブレインストーミングの後、私はそれを得る別の方法を見つけられません. この結果セットを取得するための、より優れたパフォーマンスの高い SQL クエリを見つけてください。

前もって感謝します

4

1 に答える 1

2

UNION個別のアイテムのみを保持しているため、パフォーマンスキラーになる可能性があります。
UNION ALL一方、結果セットを連結するだけなので、パフォーマンスに大きな影響はありません。

しかし、実際にそれを測定するか、説明プレーンを確認して確認する必要があります。

于 2013-09-23T15:07:31.753 に答える