为麻烦的需求实现 sql 逻辑
Implementing sql logic for a troublesome requirement
我正在开发位置类型的应用程序。所以我有一组记录如下:
Select Ways.*, ErrorFlag
from Ways with(no lock)
inner join Locations with(no lock)
on Locations.WayId = Ways.WayId
在上面的设置中,我将获得所有有位置的方式。
现在我需要用每种方式显示一个标志,这样
条件 1) 如果道路的任何位置不遵守其规则。
每个位置的开始时间 < 结束时间的规则。
所以,现在我只是在做一个算法,因为我不太擅长实现查询。
对于我已有的结果集,
第 1 步)我将创建一个函数,该函数将接收结果集中已存在的 WayId。
步骤 2) 函数将 select 来自位置 table 的所有位置,其中 wayid = @WayId。
步骤 3) 遍历第 2 步中 selected selected 位置的每一行 ID,检查开始时间是否 > 结束时间,如果是,它将 return true 否则它将继续前进并在通过每一行后,它将 return false.
我应该如何实施。你能建议点什么吗?或者如果你有更好的方法。请分享一个查询示例,这样我就更容易理解了..
Table结构如下:
方式
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
我正在对您的源数据类型做出一些假设:
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
如果 Locations
table 中 StartTime
和 EndTime
列的类型不同,您只需要确定如何确定一个值是否更大将我的 lerror.StartTime > lerror.EndTime
逻辑替换为您自己的逻辑。
我正在开发位置类型的应用程序。所以我有一组记录如下:
Select Ways.*, ErrorFlag
from Ways with(no lock)
inner join Locations with(no lock)
on Locations.WayId = Ways.WayId
在上面的设置中,我将获得所有有位置的方式。
现在我需要用每种方式显示一个标志,这样
条件 1) 如果道路的任何位置不遵守其规则。
每个位置的开始时间 < 结束时间的规则。
所以,现在我只是在做一个算法,因为我不太擅长实现查询。
对于我已有的结果集, 第 1 步)我将创建一个函数,该函数将接收结果集中已存在的 WayId。
步骤 2) 函数将 select 来自位置 table 的所有位置,其中 wayid = @WayId。
步骤 3) 遍历第 2 步中 selected selected 位置的每一行 ID,检查开始时间是否 > 结束时间,如果是,它将 return true 否则它将继续前进并在通过每一行后,它将 return false.
我应该如何实施。你能建议点什么吗?或者如果你有更好的方法。请分享一个查询示例,这样我就更容易理解了..
Table结构如下:
方式
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
我正在对您的源数据类型做出一些假设:
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
如果 Locations
table 中 StartTime
和 EndTime
列的类型不同,您只需要确定如何确定一个值是否更大将我的 lerror.StartTime > lerror.EndTime
逻辑替换为您自己的逻辑。