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