Sql 如何在Visual FoxPro中临时禁用默认排序?

Sql 如何在Visual FoxPro中临时禁用默认排序?,sql,oledb,visual-foxpro,Sql,Oledb,Visual Foxpro,我正在做一个搜索,我想保持自然秩序,以保持排名。以下是我的代码查询: 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 BUY

我正在做一个搜索,我想保持自然秩序,以保持排名。以下是我的代码查询:

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}'"
联合中的第一个选择返回一个精确匹配,而最后一个选择返回一个非常一般的匹配。问题是结果总是按买方id排序返回。我无法更改现有的表/索引,我看到有几个索引,买方id是第一个索引。如果可能,我想“禁用”索引顺序,以便首先返回第一次选择的结果,然后将后续选择实际附加到前一次选择。这可能吗


另外,默认情况下,联合是不同的,如果我在每个select和order中添加一个“rank”列,它将留下重复的结果,因为rank列在每个select查询之间是不同的。

我认为不可能直接实现这一点。目标是在没有ORDERBY子句的情况下对结果进行某种隐含的排序,问题是关系没有特定的顺序。因此,除非查询依赖于数据库引擎的特定于实现的行为,否则您可能无法直接到达那里

UNION ALL
可能会保留原始顺序,尽管我不知道这是可以保证的。如果是这样的话(或者即使不是这样,您也可以使用OP中提到的排名思想来进行排序),然后您可以在查询后“手动”删除重复项

另一种可能会导致非常难看的查询并且可能很难优化的方法是再次使用UNION ALL(或rank idea)来获取每个条件的结果,但在每个后续条件中添加先前条件的
而不是
。换句话说,让每个单独的选择只选择它专门添加到最终结果中的行:

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确实不保留顺序,则可以在每个select中添加一个秩值,然后按该值对最终结果进行排序(查询本身将具有唯一性,其中包含所有
not(条件)
子句。

如果一个查询在一个查询中包含所有限定符,但在限定的位置有附加列作为标志,那么该查询如何…因为您的上一个联合具有“或”值,只需将其用作WHERE,但将特定标准用作其合格性的标志,然后您可以为每个人保留一个条目,但将其标记为“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”…因此likeamematch和LikeAddressMatch是罪魁祸首…然而,VFP确实有一个函数,所以我更改了它们

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

类似于.P/P。考虑删除OLED和VFP标签是很诱人的。从某种意义上说,它基本上只是一个SQL问题,它可能会吸引更多的观众。但是,当然,下一个评论将是“什么数据库?”。这很有趣。它将依赖于实现,因此一些数据库引擎可能会按该顺序返回它,而其他引擎则不会(对于数据库,它甚至可能会随着版本的不同而变化)。我相信这就是@Zach在“P.s.”中所指的当他提到添加秩列时。@MarkWilkins,是的,曲解了这个元素。@Zach,看一看修改后的答案。这应该可以得到你想要的结果,每个人只输入一个条目,而不需要复杂的所有联合。谢谢-我现在正在看这个。@DRapp-我认为它不喜欢我们添加的布尔列。我得到了e错误“缺少函数名)”。我相信这与“匹配”栏目有关。也许我们分配得不恰当?或者VFP不喜欢在列选择区域进行比较?我同意。非常难看!哈哈,我也不确定工会是否会维护秩序。扎克:真的!我还没有时间研究它,但我认为@DRapp的答案看起来很有希望。如果你觉得有效,我会投赞成票。