我正在研究各种应用的位置。所以我有一组记录如下:
Select Ways.*, ErrorFlag
from Ways with(no lock)
inner join Locations with(no lock)
on Locations.WayId = Ways.WayId
在上面的集合中,我将获得所有具有位置的方式。
现在我要求每个方向显示一个标志
条件1)如果该方式的任何位置不遵守其规则。
规定每个位置应具有开始时间<结束时间。
所以,现在我只是和我一起做一个算法,因为我不太善于实现查询。
对于我已经拥有的结果集, 步骤1)我将创建一个函数,它将接收已经在结果集中的WayId。
步骤2)功能将从位置表中选择所有位置,其中wayid = @WayId。
步骤3)循环遍历在步骤2中选择的所选位置的每一行id,并检查开始时间是否>结束时间,如果它是肯定的话,它将返回真正的另一个明智的它将继续前进,并且在通过每一行之后,它将返回false。
我该如何实现呢?你能提出什么建议吗?或者如果你有更好的方法。请分享一个查询示例,这样我就可以轻松理解..
表结构如下:
途径
WayId colorcode weight length
1 red 50 500m
2 blue 100 200m
地点
LocationId WayId Starttime Endtime
1 1 12:00AM 11:00AM
2 1 1:00 PM 2:00 PM
3 1 3:00 PM 4:00PM
输出:需要以下输出,因为WayId = 1具有位置,因此它将显示但是id = 2的方式没有任何位置,因此它不会显示。
2)该方式有三个位置,因此它将计算并显示
3)该方法应显示ErrorFlag = true,因为其中一个位置的开始时间大于结束时间。
WayId colorCode weight length ErrorFlag Locations
1 red 50 500 true 3
答案 0 :(得分:0)
我对您的源数据类型做了一些假设:
DECLARE @Ways TABLE (
WayId INT,
ColorCode VARCHAR(10),
[Weight] INT,
[Length] INT
)
DECLARE @Locations TABLE (
LocationId INT,
WayId INT,
StartTime TIME(0),
EndTime TIME(0)
)
INSERT INTO @Ways
SELECT 1, 'red', 50, 500
UNION
SELECT 2, 'blue', 100, 200
INSERT INTO @Locations
SELECT 1, 1, '12:00', '11:00'
UNION
SELECT 2, 1, '13:00', '14:00'
UNION
SELECT 3, 1, '15:00', '16:00'
但你可以这样做:
SELECT w.WayId,
w.ColorCode,
w.[Weight],
w.[Length],
CASE WHEN EXISTS (
SELECT 1
FROM @Locations lerror
WHERE lerror.WayId = l.WayId
AND lerror.StartTime > lerror.EndTime
)
THEN 'true'
ELSE 'false'
END AS ErrorFlag,
COUNT(l.WayId) AS Locations
FROM @Ways w
JOIN @Locations l ON w.WayId = l.WayId
GROUP BY w.WayId, w.ColorCode, w.[Weight], w.[Length], l.WayId
如果StartTime
表中EndTime
和Locations
列的类型不同,您只需确定如何确定一个值是否大于另一个值并替换我的lerror.StartTime > lerror.EndTime
逻辑与你自己。