1

Я работаю над местоположением вида приложения. Таким образом, у меня есть набор записей, сбитые, как показано ниже: Реализация sql-логики для трудного требования

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

В выше наборе я получить все пути, которые имеют место.

Теперь у меня есть требование, чтобы показать флаг с каждым таким образом, что

условия 1) Если какое-либо место на пути не следуя свои правила.

Правило, что каждое место должно иметь время начала < время окончания.

Итак, теперь у меня только есть algo со мной, так как я не так хорош в реализации запросов.

Для набора результатов у меня уже есть, Шаг 1) Я создам функцию, которая получит WayId, которая уже находится в наборе результатов.

Шаг 2) функция выберет все местоположения из таблицы местоположений, где wayid = @WayId.

Шаг 3) Прокрутите каждый идентификатор строки выбранных в шаге 2 выбранных местоположений, и проверьте, будет ли время начала> конечного времени, и если оно будет указывать «да», оно вернет истинное другое мудрый, он продолжит движение вперед и после прохождения каждого row, он вернет 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 

Выход : Следующий выход необходим, так как Way with WayId = 1 имеет места, чтобы он отображался, но путь с id = 2 не имеет никаких мест, поэтому он не будет отображаться.

2) Способ имеет три места, так что будет рассчитывать и показывать

3) Способ должен показать ErrorFlag = верно, как один из его места имеют начальное время больше, чем время окончания.

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

Как вы решаете, что 12:00 утра больше 11:00? – dfundako

+0

Что такое SQL-тип столбцов 'Starttime' и' Endtime' в таблице 'Locations'? – 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 

Если ваши типы для StartTime и EndTime столбцов в Locations таблица отличается, вам просто нужно установить, как вы определяете, больше ли одно значение, чем другое, и замените мой lerror.StartTime > lerror.EndTime с вашим собственным.

+0

Поскольку я изучил этот подзапрос, выполняется сначала, а затем только основной запрос. Итак, как можно, чтобы вышеупомянутый подзапрос выбирал записи на основе L.WayId, поскольку «L» является частью основного запроса, а не частью подзапроса? – Sweetie

+0

Что заставляет вас думать, что подзапрос в предложении SELECT выполняется первым? Предложение 'FROM' выполняется сперва, а предложение SELECT (включая любые подзапросы) происходит намного позже в порядке выполнения (фактически, только' DISTINCT', 'ORDER BY' и' TOP' обрабатываются после 'SELECT'). Поэтому вполне возможно ссылаться на таблицу из предложения 'FROM' в подзапросе в предложении SELECT. Если бы вы этого захотели, вы могли бы достичь этого, присоединившись к таблице, но я чувствовал, что вышеупомянутая реализация была более четкой в ​​отношении ее намерений. – 3N1GM4