2

ランキングを維持するために、自然な秩序を保ちたいところを探しています。これが私のコードクエリです:

SELECT buyer_id, first, last, ALLTRIM(address) AS address1, city, state FROM BUYERMAST.DBF WHERE first = '{0}' AND last = '{1}' UNION 
SELECT buyer_id, first, last, ALLTRIM(address) AS address1, city, state FROM BUYERMAST.DBF WHERE phone = '{6}' UNION 
SELECT buyer_id, first, last, ALLTRIM(address) AS address1, city, state FROM BUYERMAST.DBF WHERE first LIKE '{0}' AND last LIKE '{1}' UNION 
SELECT buyer_id, first, last, ALLTRIM(address) AS address1, city, state FROM BUYERMAST.DBF WHERE address LIKE '{2}' AND city LIKE '{3}' UNION 
SELECT buyer_id, first, last, ALLTRIM(address) AS address1, city, state FROM BUYERMAST.DBF WHERE first = '{0}' OR last = '{1}' OR address = '{2}' OR city = '{3}' OR state = '{4}' OR zip = '{5}' OR phone = '{6}' or email = '{7}'"

ユニオンの最初の選択は完全一致を返しますが、最後の選択は非常に一般的な一致を返します。問題は、結果が常にbuyer_idでソートされて返されることです。既存のテーブル/インデックスを変更できません。buyer_idが最初のインデックスであるインデックスがいくつかあることがわかります。可能であれば、インデックスの順序を「無効」にして、最初の選択の結果が最初に返され、後続の選択が実際に前の選択に追加されるようにします。これは可能ですか?

PSデフォルトでは、ユニオンは区別されます。各選択に「ランク」列を追加して並べ替えると、ランク列が各選択クエリ間で区別されるため、結果が重複したままになります。

4

2 に答える 2

1

1 つのクエリにすべての修飾子が含まれているが、修飾された WHERE フラグとして追加の列がある SINGLE クエリはどうですか...最後のユニオンには全面的に「OR」値があるため、それを WHERE として使用しますが、特定の基準は次のように使用します。どのように認定されたかにフラグを立てると、1 人あたり 1 つのエントリを保持できますが、分析のために「howeverMatched」としてフラグを立てることができます。

SELECT 
      buyer_id, 
      first, 
      last, 
      address AS address1, 
      city, 
      state,
      ( first = '{0}' AND last = '{1}' ) as ExactNameMatch,
      ( phone = '{6}' ) as PhoneMatch,
      ( LIKE( first, '{0}' ) AND LIKE( last, '{1}' )) as LikeNameMatch,
      ( LIKE( address, '{2}' ) AND LIKE( city, '{3}' )) as LikeAddressMatch
   FROM 
      BuyerMast
   WHERE 
         first = '{0}' 
      OR last = '{1}' 
      OR address = '{2}' 
      OR city = '{3}' 
      OR state = '{4}' 
      OR zip = '{5}' 
      OR phone = '{6}' 
      OR email = '{7}'
      OR ( first LIKE '{0}' AND last LIKE '{1}' )
      OR ( address LIKE '{2}' AND city LIKE '{3}' )

名前一致修飾子の「LIKE」が気に入らないので、LikeNameMatch と LikeAddressMatch が原因です...ただし、VFP には FUNCTION があるため、それらを変更しました

from   first LIKE '{0}'
to     LIKE( first, '{0}' )

残りと同様。

于 2012-04-18T10:56:34.163 に答える
0

それを直接達成することは不可能だと思います。目標は、ORDER BY 句を使用せずに結果に何らかの暗黙の順序を設定することです。問題は、リレーションに特定の順序がないことです。そのため、クエリがデータベース エンジンの実装固有の動作に依存しない限り、おそらくそこに直接到達することはできません。

UNION ALL保証されているかどうかはわかりませんが、 a が元の順序を保持する可能性があります。その場合(または、OPで言及されているランクのアイデアを使用してORDER BYを実行できない場合でも)、クエリの後に重複を「手動で」削除できます。

非常に見苦しいクエリになり、最適化が難しい可能性がある別の可能性は、UNION ALL (またはランクのアイデア) を再度使用して各条件の結果を取得し、その後の各条件NOTに前の条件を追加することです。言い換えれば、個々の SELECT が最終結果に追加する行のみを選択するようにします。

SELECT ... WHERE condition1 UNION ALL
SELECT ... WHERE condition2 and NOT (condition1) UNION ALL
SELECT ... WHERE condition3 and NOT(condition1) and NOT (condition2)
etc. and on into a very ugly query

上記の例で、UNION ALL が実際に順序を保持しない場合は、各選択にランク値を追加し、その値で最終結果を ORDER することができます (クエリ自体には、すべてのクエリで一意性が組み込まれています)。not(condition)条項。

于 2012-04-18T00:18:27.757 に答える