3

我是 ESRI SQL 用户,所以我的查询必须SELECT * FROM tablename WHERE

我有带有日期/时间字段(称为 timedate)的基于 GPS 的车辆记录(扫雪机),我需要 A.)根据单独表中的整数字段选择前 x 小时内发生的记录或B.) 根据单独表中的日期/时间字段选择比日期/时间新的记录。如果是案例 A,那么案例 B 中的字段将为空。如果是案例 B,那么案例 A 中的字段将为 0。

这是我为案例 A 写的内容。

SELECT * FROM myDataTable
WHERE(DATEDIFF(hh, TimeDate, GETDATE()) <= (select NumberofHours from myHoursControlTable where District = 2)
AND Fleet = 'District 2'
AND NOT [Speed] = 0
AND ([AssetDesc] LIKE  'Sander/Plow%' AND Input2On = 'On' AND Input1On = 'On')) 

这就是我为案例 B 写的内容。

SELECT * FROM myDataTable
WHERE(TimeDate <= (select StartTime from myHoursControlTable where District = 2)
AND Fleet = 'District 2'
AND NOT [Speed] = 0
AND([AssetDesc] LIKE  'Sander/Plow%' AND Input2On = 'On' AND Input1On = 'On')) 

他们都工作,但有人可以帮我把它放在一起吗?当我尝试使用 case 语句时,我不断收到错误消息:“当 EXISTS 未引入子查询时,选择列表中只能指定一个表达式。” 我也有必须以“Select *”开头的限制,因为我在 ESRI 定义查询中执行此操作。

任何帮助表示赞赏。

4

1 回答 1

2

非常快的想法。可能不是最优化的,但为什么不简单地使用 OR 和两个 WHERE 语句?

SELECT * FROM myDataTable
WHERE(
(
(DATEDIFF(hh, TimeDate, GETDATE()) <= (select NumberofHours from myHoursControlTable where District = 2)
AND Fleet = 'District 2'
AND NOT [Speed] = 0
AND ([AssetDesc] LIKE  'Sander/Plow%' AND Input2On = 'On' AND Input1On = 'On')) 
)
OR
(
(TimeDate <= (select StartTime from myHoursControlTable where District = 2)
AND Fleet = 'District 2'
AND NOT [Speed] = 0
AND([AssetDesc] LIKE  'Sander/Plow%' AND Input2On = 'On' AND Input1On = 'On')) 
)

更新

由于 A) 和 B) 共享大量条件,您可以像下面这样组合。这是理所当然的,您想捕获满足条件 A) 或 B) 的行。

SELECT * FROM myDataTable
WHERE
  (    
    DATEDIFF(hh, TimeDate, GETDATE()) <= 
    (select NumberofHours from myHoursControlTable where District = 2)
  OR 
    TimeDate <= (select StartTime from myHoursControlTable where District = 2)
  )
AND Fleet = 'District 2'
AND NOT [Speed] = 0
AND ([AssetDesc] LIKE  'Sander/Plow%' AND Input2On = 'On' AND Input1On = 'On'); 
于 2013-11-12T23:42:21.493 回答