1

我正在处理类型的应用程序。所以,我有一组放倒像下面的记录: 实施sql逻辑的一个麻烦的要求

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,并检查开始时间>结束时间,并且如果它说是,它将返回true,否则它将继续前进,并且在通过每个行,它会返回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 =真为它的一个位置有开始时间比结束时间大。

WayId colorCode weight length ErrorFlag Locations 
1  red  50  500 true   3 
+2

你如何确定12:00 am大于11:00 am? – dfundako

+0

“Locations”表中的“Starttime”和“Endtime”列的SQL类型是什么? – 3N1GM4

回答

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 

如果你的类型中的StartTimeEndTimeLocations表是不同的,你只需要确定你是如何确定一个值是否大于另一个并替换我的lerror.StartTime > lerror.EndTime个逻辑与你自己的。

+0

正如我研究过的那个子查询先执行然后只执行主查询。那么上述子查询如何根据L.WayId选择记录,因为“L”是主查询的一部分,而不是子查询的一部分? – Sweetie

+0

是什么让你认为'SELECT'子句中的子查询首先执行? FROM'子句首先被执行,'SELECT'子句(包括任何子查询)在执行顺序中很晚(事实上,在SELECT之后只处理'DISTINCT','ORDER BY'和'TOP' )。因此,从SELECT语句子查询中的FROM子句引用一个表是完全可能的。如果你愿意,你也可以通过加入到桌面来实现这一点,但是我觉得上面的实现在意图上更加清晰。 – 3N1GM4