关于强制HASH语句报错,100分,解决马上给
问题描述,我在做SQL语句优化的时候发现使用HASH匹配,当时没有报错,可能条件不一样,,运行了一段时间发现报如下错误
SELECT COUNT(*)
FROM vcb_ContractGrid
LEFT JOIN ( SELECT DISTINCT
BusinessGUID
FROM vjd_Work2Business
WHERE Type = '合同'
AND BeginDateJh != ConfirmedBeginDate
) b ON vcb_ContractGrid.ContractGUID = b.BusinessGUID
WHERE vcb_ContractGrid.BUGUID = ( '993dcc44-7297-415f-9f4a-6c87e7f49387' )
AND vcb_ContractGrid.IfDdhs = 1
AND vcb_ContractGrid.IfConfirmFkPlan = 0
AND vcb_ContractGrid.JbrGUID = ( '39957769-229b-442e-b839-7ff710433c17' )
AND ( (( ( 1 = 1
AND ( JbDeptCode = 'zb.c1006'
OR JbDeptCode LIKE 'zb.c1006.%'
)
)
AND ( 1 = '1' )
)
AND ( 88 = 88 ))
)
AND ( ( vcb_ContractGrid.ContractGUID IN (
SELECT cb_ContractProj.ContractGUID
FROM cb_ContractProj
INNER HASH JOIN ( SELECT ContractGUID
FROM cb_Contract2HTType aa
INNER JOIN cb_ContractAction bb ON aa.HtTypeGUID = bb.RefGUID
AND ( bb.isView = 1 )
AND bb.BUGUID = '993dcc44-7297-415f-9f4a-6c87e7f49387'
AND aa.BUGUID = '993dcc44-7297-415f-9f4a-6c87e7f49387'
INNER JOIN MyUserToOrg ku2o ON bb.OrgGuid = ku2o.OrgGuid
AND ku2o.UserGUID = '39957769-229b-442e-b839-7ff710433c17'
) b ON b.ContractGUID = cb_ContractProj.ContractGUID
WHERE cb_ContractProj.ProjGUID IN (
'7e826468-fc51-44bd-a291-a8f5f5996848',
'490a5165-f4bc-4265-b5bb-4d4fd8d4c1c4',
'90a09346-9d7a-4746-a465-897655158e04',
'bf9593a2-af37-4a65-907b-395e13c1cac1',
'8e913ee3-e991-458d-8321-d9f76a3433d2',
'd314b067-603e-4691-a785-2cb384004c94',
'eaa6f096-9f6d-4f2b-87df-d95e44f42a5c',
'37327427-e1e5-4e56-bd87-62cb98bfb392',
'14e29305-1c19-492f-a6f9-cfb9c16cde8c',
'e6689bc2-8995-43cf-a497-561122bfea7f',
'b4243753-0d76-49d7-a22c-567022fc1188',
'bd69b6cf-5b30-462a-a485-bbdcd7ede872',
'839933cd-8669-4e30-bc76-0cbf5515b206',
'00000000-0000-0000-0000-000000000000' ) ) )
AND vcb_ContractGrid.ContractGUID = '9a11ee59-0345-4f3e-8c49-21474c95d980'
) ;
USE TEMPDB
GO
IF OBJECT_ID('TA') IS NOT NULL DROP TABLE TA
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
IF OBJECT_ID('P1') IS NOT NULL DROP PROCEDURE P1
GO
CREATE TABLE TA(ID INT,VAL VARCHAR(50))
CREATE TABLE TB(ID INT,AID INT,VAL VARCHAR(50))
GO
SET NOCOUNT ON
GO
INSERT INTO TA
SELECT 1,'A' UNION ALL
SELECT 2,'B' UNION ALL
SELECT 3,'C' UNION ALL
SELECT 4,'D' UNION ALL
SELECT 5,'E'
GO
INSERT INTO TB
SELECT 1,1,'AA' UNION ALL
SELECT 2,1,'AB' UNION ALL
SELECT 1,2,'BA' UNION ALL
SELECT 2,2,'BB' UNION ALL
SELECT 2,3,'BC'
GO
GO
PRINT '-----------------------'
PRINT 'TA.ID>=1 AND TA.ID<2可以'
GO
SELECT *
FROM TA
INNER HASH JOIN TB ON TA.ID=TB.AID
WHERE TA.ID>=1 AND TA.ID<2
GO
PRINT '-----------------------'
PRINT '加=1就不行'
GO
SELECT *
FROM TA
INNER HASH JOIN TB ON TA.ID=TB.AID
WHERE TA.ID>=1 AND TA.ID<=1
GO
PRINT '-----------------------'
PRINT '同样报错的语句,用存储过程就可以'
GO
CREATE PROCEDURE P1(@MIN INT,@MAX INT)
AS
SELECT *
FROM TA T1
INNER HASH JOIN TB T2 ON T1.ID=T2.AID
WHERE T1.ID >=@MIN AND T2.ID<=@MAX
GO
EXEC P1 1,1
/*
-----------------------
TA.ID>=1 AND TA.ID<2可以
警告: 由于使用了本地联接提示,联接次序得以强制实施。
-----------------------
加=1就不行
消息 8622,级别 16,状态 1,第 1 行
由于此查询中定义了提示,查询处理器未能生成查询计划。请重新提交查询,并且不要在查询中指定任何提示,也不要使用 SET FORCEPLAN。
-----------------------
同样报错的语句,用存储过程就可以
警告: 由于使用了本地联接提示,联接次序得以强制实施。
*/