3

以下のようなクエリを動的に生成しています。これは、結合条件の一部として同じ属性のいくつかを持つルールを回避し、結合条件の一部として (何度でも) 左結合することによって、ルールのさまざまな組み合わせを作成します。

SELECT count(*) 
FROM rules AS t1 
LEFT JOIN rules AS t2
 ON t1.id != t2.id
 AND ...
LEFT JOIN rules AS t3
 ON t1.id != t2.id AND t1.id != t3.id AND t2.id != t3.id
 AND ...

現在、結合された行からIDの配列を作成し、それらを並べ替えてグループ化することにより、重複を削除しています。

SELECT sort(array[t1.id, t2.id, t3.id]) AS ids
...
GROUP BY ids

重複行を削除するより良い方法があるかどうか知りたいです。

t1.ID | t2.ID | t3.ID
---------------------
  A   |   B   |   C
  C   |   B   |   A

する必要があります

t1.ID | t2.ID | t3.ID
---------------------
  A   |   B   |   C

または

t1.ID | t2.ID | t3.ID
---------------------
  C   |   B   |   A

しかし、両方ではありません。

編集:行の順列から組み合わせ行に移動したいと思います。

4

4 に答える 4

4

!= で参加するのではなく、<= で参加してみることをお勧めします。

これで、t1.id > t2.id、t2.id > t3.id などのすべての組み合わせが得られます。

行は順序付けられたセットであるため、「重複」しません。同等のメンバーを含むセットは、必然的に同一の順序付けられたセットになります。

于 2010-11-22T06:46:44.987 に答える
3

行の順列から組み合わせ行に行きたいということですか?

もしそうなら、個別の回答の選択は間違っています。別個のものを選択すると、別個の順列が選択されます。私はあなたがそれを行うかなり良い方法を持っていると思います. 私が考えることができる唯一のことは、ルールを文字列に連結し、その場所でソートすることです。Postgresql を使用しているようですが、組み込みの文字列関数でそれを行う関数はありません。

シンボルの量が少ない場合は、インデックス 1 に「A」を挿入し、インデックス 2 に「B」を挿入するなどして、事前に並べ替えられた配列にそれらを挿入できる場合があります。

于 2010-11-22T06:21:55.883 に答える
2

すべての重複を除外するには、結果に順序を付ける必要があります。これは、次のことを確認することで実現できますa<b<c。また、結果に注文があれば、結果セットに個別に適用できます。

`SELECT count(*)FROMルールAS t1

LEFTJOINルールASt2ON t1.id!= t2.id AND

LEFTJOINルールASt3ON t1.id!= t2.id AND t1.id!= t3.id AND t2.id!=t3.id..。

t1.id<t2.idおよびt2.id<t3.id..。

そして...`

于 2010-11-22T17:57:38.657 に答える
1

あなたが達成しようとしていることを正確に理解するのは難しいですが、ABC CBA の重複を避けるために、これを試してください:

SELECT count(*) 
FROM rules AS t1 
LEFT JOIN rules AS t2
 ON t1.id **<** t2.id
 AND ...
LEFT JOIN rules AS t3
 ON t1.id **<** t2.id AND t1.id **<** t3.id AND t2.id **<** t3.id
 AND ...

そうすれば、答えは常に順序付けられます

于 2010-11-22T08:18:57.113 に答える