1

Je travaille sur des emplacements de type application. J'ai donc un ensemble d'enregistrements fait descendre comme ci-dessous: Implémentation de la logique sql pour une exigence gênante

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

En jeu ci-dessus, je vais obtenir tous les moyens qui ont des emplacements.

J'ai maintenant besoin de montrer un drapeau à chaque manière telle que

condition 1) Si l'emplacement de la voie ne suit pas ses règles.

Règle que chaque emplacement doit avoir l'heure de début < heure de fin. Donc, maintenant j'ai juste un algo avec moi car je ne suis pas très bon dans l'implémentation des requêtes.

Pour le jeu de résultats que j'ai déjà, Étape 1) Je vais créer une fonction qui recevra un WayId qui est déjà dans le jeu de résultats.

L'étape 2) sélectionne toutes les localisations de la table des emplacements où wayid est = @WayId.

Étape 3) Parcourez chaque rangée d'identifiants d'emplacements sélectionnés à l'étape 2 et vérifiez si heure de début> heure de fin et si elle dit oui, elle reviendra vraie autrement elle continuera à avancer et après avoir traversé chaque row, Il retournera faux.

Comment dois-je l'implémenter? Pourriez-vous suggérer quelque chose? Ou si vous avez une meilleure approche. S'il vous plaît faire partager un exemple de requête qui deviendra un peu facile pour moi de comprendre ..

structure Le tableau est ci-dessous:

façons

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

Emplacements

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 

sortie : La sortie ci-dessous est nécessaire comme Way avec WayId = 1 ont des emplacements donc il affichera mais avec id = 2 n'a pas d'emplacements donc il ne sera pas affiché.

2) La voie a trois endroits il comptera et montrer

3) La manière doit montrer ErrorFlag = true comme l'un de ses emplacements ont le temps de démarrage plus que le temps final.

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

Comment décidez-vous que minuit est supérieur à 11h00? – dfundako

+0

Quel est le type SQL des colonnes 'Starttime' et' Endtime' dans votre table 'Locations'? – 3N1GM4

Répondre

0

Je fais quelques hypothèses au sujet de vos types de données source:

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' 

Mais vous pouvez faire ceci:

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 

Si vos types pour les colonnes StartTime et EndTime dans la Locations table sont différents, vous avez juste besoin d'établir comment vous déterminez si une valeur est supérieure à l'autre et remplacer mon lerror.StartTime > lerror.EndTime logique avec les vôtres.

+0

Comme j'ai étudié cette sous-requête s'exécute d'abord, puis seulement la requête principale. Alors, comment est-il possible pour la sous-requête ci-dessus de sélectionner les enregistrements basés sur L.WayId comme "L" est la partie de la requête principale et non la partie de la sous-requête? – Sweetie

+0

Qu'est-ce qui vous fait penser que la sous-requête de la clause 'SELECT' s'exécute en premier? La clause 'FROM' est exécutée en premier, avec la clause' SELECT' (y compris toutes les sous-requêtes) arrivant beaucoup plus tard dans l'ordre d'exécution (en fait, seuls 'DISTINCT',' ORDER BY' et 'TOP' sont traités après' SELECT'). Par conséquent, il est parfaitement possible de référencer une table à partir de la clause 'FROM' dans une sous-requête dans la clause' SELECT'. Si vous le vouliez, vous pourriez aussi y parvenir en vous joignant à la table, mais je pensais que la mise en œuvre ci-dessus était plus claire quant à son intention. – 3N1GM4