为麻烦的需求实现 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 中 StartTimeEndTime 列的类型不同,您只需要确定如何确定一个值是否更大将我的 lerror.StartTime > lerror.EndTime 逻辑替换为您自己的逻辑。