这是我的SQL
select DISTINCT d.* from Device d, Company c1
WHERE
EXISTS ( select * from (SELECT * FROM [dbo].[Split] ('HENNEPIN COUNTY MN', ',')) as s
WHERE c1.CompanyName like '%' + s.items + '%' AND d.CustomerID c1.CompanyID)
OR
EXISTS ( select * from (SELECT * FROM [dbo].[Split] ('HENNEPIN COUNTY MN', ',')) as s
WHERE d.CustomerName like '%' + s.items + '%')
在排序方面,它将OR误解为笛卡尔积,你可以在这里阅读:http://www.scarydba.com/2009/09/15/no-join-predicate/
有什么方法可以避免这种情况吗?
答案 0 :(得分:3)
你在说
select DISTINCT d.* from Device d, Company c1
但您没有以任何方式加入Device
和Company
。因此,您将获得从Device
配对到Company
的每条记录的每条记录,并获得Device
次记录的记录数量Company
返回的记录数。
由于您只是从Device
返回字段,因此难怪您需要DISTINCT
并且难怪它花了这么长时间。
如果这是您真正想要的,您可以使用CROSS JOIN
操作删除该消息:
select d.*
from Device d
CROSS JOIN Company c1
有关CROSS JOIN操作的更多信息,请参阅here。
但我们可以加快速度。试试这个:
;
WITH s AS (
SELECT *
FROM [dbo].[Split] ('HENNEPIN COUNTY MN', ',') s
)
SELECT d.*
FROM Device d
WHERE EXISTS (
select *
from s
JOIN Companies c1
ON c1.CompanyName like '%' + s.items + '%'
where d.CustomerID = c1.CompanyID
)
OR EXISTS (
select *
from S
where d.CustomerName like '%' + s.items + '%'
)
这可能会进一步改善,但鉴于我不确定这个查询试图解决什么问题,这是我现在能做的最好的事情。