更快的方式来做这个选择查询
说员工有三列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