2017-05-08 112 views
0

我確定這些問題是不滿的,但我真的需要一些幫助。在過去的3個小時裏,我一直盯着這個SQL查詢,而我無法解釋它的一些邏輯。通常我不會問,但我已經到了最後期限。無法解釋這個SQL查詢

在WHERE子句中,您將看到一個If結構。從我可以看到它檢查是否採摘日期是有效的。

然而,它的措辭的方式只是看起來很奇怪,它不會總是導致一個'之間'? (If x > y AND x < z then 'Between', else 'Not Between) = 'Between'

而且這個'if'結果也應用於什麼對象?任何幫助表示讚賞我解釋它的最終結果變得WHERE 'Between' AND 'Between',剛剛doent有意義的方式......

(附:查詢是訪問書面)

SELECT 
    DWH_PickOrderLines_Temp.*, 
    IIf(DWH_PickOrderLines_Temp.WayOfTransport IN ("ON", "PD"), "Kitting " & Mid(tbl_District_Activiteit.Activiteit, 8), IIf(DWH_PickOrderLines_Temp.PickMethode IN ("K", "V"), "Picking Bulk", tbl_District_Activiteit.Activiteit)) AS Activiteit, 
    IIf(DWH_PickOrderLines_Temp.WayOfTransport IN ("ON", "PD"), "Kitting", tbl_District_Activiteit.[Activiteit groep]) AS [Activiteit groep], 
    R14_Distinct_Warehouse_Location.Proces, 
    R14_Distinct_Warehouse_Location.Gebouw 
FROM DWH_PickOrderLines_Temp 
LEFT JOIN R14_Distinct_Warehouse_Location 
    ON DWH_PickOrderLines_Temp.PickLocation = R14_Distinct_Warehouse_Location.PickLocation 
WHERE (((IIf([DWH_PickOrderLines_Temp].[PickDateTime] >= [R14_Distinct_Warehouse_Location].[tbl_Location_Zone_District.ValidFrom] 
AND [DWH_PickOrderLines_Temp].[PickDateTime] < [R14_Distinct_Warehouse_Location].[tbl_Location_Zone_District.ValidTo], "Between", "Not Between")) = "Between") 
AND ((IIf([DWH_PickOrderLines_Temp].[PickDateTime] >= [R14_Distinct_Warehouse_Location].[tbl_District_Activiteit.ValidFrom] 
AND [DWH_PickOrderLines_Temp].[PickDateTime] < [R14_Distinct_Warehouse_Location].[tbl_District_Activiteit.ValidTo], "Between", "Not Between")) = "Between")); 
+0

你肯定報道整個查詢完全? (tbl_Location_Zone_District和tbl_District_Activiteit的連接在哪裏?) – etsa

+0

Jup,這是整個查詢。我注意到了缺少的連接。 – TheNiers

+0

而且它能工作嗎? – etsa

回答

0

的位置,永遠不會返回一個值。並且它是重複的....

declare @pickdate int = 1 
declare @validForm int = 0 

print 'start' 
if(((IIf(@pickdate >= @validForm AND @pickdate < @validForm, 'Between', 'Not Between')) = 'Between') 
AND ((IIf(@pickdate >= @validForm AND @pickdate < @validForm, 'Between', 'Not Between')) = 'Between')) 
print 'test' 
0

我認爲查詢錯過了一個部分(引用兩個表,請參閱上面的註釋)。無論如何,我認爲你可以簡化WHERE條件:

WHERE [DWH_PickOrderLines_Temp].[PickDateTime] >= [R14_Distinct_Warehouse_Location].[tbl_Location_Zone_Distric‌​t.ValidFrom] 
     AND [DWH_PickOrderLines_Temp].[PickDateTime] < [R14_Distinct_Warehouse_Location].[tbl_Location_Zone_Distric‌​t.ValidTo] 
    AND [DWH_PickOrderLines_Temp].[PickDateTime] >= [R14_Distinct_Warehouse_Location].[tbl_District_Activiteit.V‌​alidFrom] 
     AND [DWH_PickOrderLines_Temp].[PickDateTime] < [R14_Distinct_Warehouse_Location].[tbl_District_Activiteit.V‌​alidTo] 
0

你覺得爲什麼如果語句總是導致「之間」?

基本上,其中條件歸結爲:

where 
pickDateTime between validFrom1 and validTo1 
and 
pickDateTime between validFrom2 and validTo2