2017-05-08 106 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