为麻烦的需求实现sql逻辑

时间:2016-12-02 15:27:59

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012

我正在研究各种应用的位置。所以我有一组记录如下:

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

1 个答案:

答案 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表中EndTimeLocations列的类型不同,您只需确定如何确定一个值是否大于另一个值并替换我的lerror.StartTime > lerror.EndTime逻辑与你自己。