更快的方式来做这个选择查询

说员工有三列FirstName,LastName和ID。

查询应首先在名字中搜索名称,但前提是找不到名字的搜索。

所以选择* from Employee where FirstName ='test%'或lastname ='test'%'。 不会'工作。

下面的查询将起作用。

select FirstName, LastName, ID
from EMPLOYEE
WHERE 
    LastName = 'Test%'
    AND
    (COUNT(SELECT FirstName, LastName, ID FROM EMPLOYEE WHERE FirstName = 'Test%')=0)
    OR
    SELECT FirstName, LastName, ID FROM EMPLOYEE WHERE FirstName = 'Test%'

我需要将其映射回NHibernate,有没有更快的方法来做到这一点,而不是进行两次数据库调用?


试试这个:

SELECT FirstName, LastName, ID FROM EMPLOYEE WHERE FirstName = 'Test%'
OR (FirstName <> 'Test%' AND LastName = 'Test%')

FROM Employee
WHERE (FirstName LIKE 'Test%' AND LastName NOT LIKE 'Test%')
OR (LastName LIKE 'Test%' AND firstName NOT LIKE 'Test%')

当然你并不在意他们回来的顺序是什么。如果记录必须返回名字匹配的记录,后面跟着名字匹配的名字,那么这将不起作用。


“不成熟的优化是万恶之源”。

为什么你会关心在优化器看到它时如何完成搜索,而不是声明你想要的?
这一切都归结为一个布尔真值表:当FirstName匹配时,您需要记录(无论是在LastName中,匹配还是不匹配),如果FirstName不匹配,则在LastName匹配时需要记录:

F match,   L match   => yes
F match,   L nomatch => yes
F nomatch, L match   => yes
F nomatch, L nomatch => no

这正是OR条件:( (FirstName matching) OR (LastName matching) ; 唯一的丢弃记录是当名字和姓氏不匹配时。

布尔优化将确保第二个条件在第一个条件为真时不被评估。

所以你的查询是:

SELECT FirstName, LastName, ID
FROM Employee
WHERE (FirstName LIKE 'Test%')
   OR (LastName LIKE 'Test%')

更新 :我可能误解了目标,如果确实不返回任何姓氏匹配,如果记录被发现只有名字...
无论如何,过早优化的立场仍然有效......
你需要某种方式2次查询,因为你不能分辨姓名是否被考虑,直到你确定你没有任何匹配FirstName。 但是,通过适当的索引和统计数据,优化器将使其非常高效。

查询:

SELECT FirstName, LastName, ID
FROM   Employee 
WHERE  (FirstName LIKE 'Test%')
    OR (LastName LIKE 'Test%'
        AND (SELECT Count(ID)
             FROM   Employee
             WHERE  FirstName LIKE 'Test%') = 0) 

仅比前一代稍微昂贵。

链接地址: http://www.djcxy.com/p/37089.html

上一篇: faster way to do this select query

下一篇: NHibernate Expression.Like Criteria on Two Fields