Implementierung von SQL-Logik für eine lästige Anforderung

Ich arbeite an Orten Art von App. Also habe ich eine Reihe von Aufzeichnungen wie unten heruntergebracht:

Select Ways.*, ErrorFlag from Ways with(no lock) inner join Locations with(no lock) on Locations.WayId = Ways.WayId 

Im obigen Set bekomme ich alle Möglichkeiten, die Standorte haben.

Jetzt habe ich die Anforderung, eine Fahne mit jedem path so zu zeigen

Bedingung 1) Wenn irgend ein Ort des pathes seinen Regeln nicht folgt.

Regel, dass jeder Standort Startzeit <Endzeit haben sollte.

Also, jetzt habe ich nur einen Algo mit mir, wie ich bin nicht so gut in der Umsetzung von Abfragen.

Für die Ergebnismenge habe ich schon, Schritt 1) ​​Ich werde eine function erstellen, die eine WayId erhält, die sich bereits im Ergebnis gesetzt hat.

Schritt 2) Die function wählt alle Orte aus der Standorte aus, wobei wayid = @WayId ist.

Schritt 3) loop durch jede Zeilen-ID von Standorten ausgewählt in Schritt 2 und überprüft, ob Startzeit> Endzeit und wenn es ja sagt, wird es wieder wahr werden weise wird es weiter voran und nach Durchgang durch jede Zeile, wird es falsch zurückgeben.

Wie soll ich das umsetzen? Könnten Sie etwas vorschlagen? Oder wenn du einen besseren Ansatz hast. Bitte teilen Sie ein Abfrage-Beispiel, so dass es ein bisschen einfach für mich zu verstehen ..

Tabellenstruktur ist unten:

pathe

 WayId colorcode weight length 1 red 50 500m 2 blue 100 200m 

Standorte

 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 

Ausgabe: Die unten liegende Ausgabe wird benötigt, da Way mit WayId = 1 Standorte haben, also wird es angezeigt, aber path mit id = 2 hat keine Locations, so dass es nicht angezeigt wird.

2) Der path hat drei Standorte so wird es zählen und zeigen

3) Der path sollte zeigen ErrorFlag = true als einer seiner Standorte haben Startzeit größer als Endzeit.

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

Ich mache einige Annahmen über Ihre Quelldatentypen:

 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' 

Aber das könntest du machen

 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 

Wenn Ihre Typen für die StartTime und EndTime in der Tabelle Locations unterschiedlich sind, müssen Sie nur festlegen, wie Sie bestimmen, ob ein Wert größer als der andere ist und replace Sie meine lerror.StartTime > lerror.EndTime Logik mit Ihren eigenen.