Синтаксис SQL - есть предложение? - PullRequest
0 голосов
/ 28 марта 2012

Я должен знать это - но я не знаю, может кто-нибудь помочь мне с синтаксисом плз.

Допустим, я отслеживаю бегунов в эстафете по пересеченной местности, у меня есть основной стол соединения, который связывает бегунов с гонками ... и таблица бегунов, которая сообщает мне, где / когда они начали свою ногу и где / когда они закончились ... есть также контрольно-пропускные пункты, которые регистрируются вдоль маршрута.

Требуется, чтобы у каждого бегуна была начальная и конечная точка - ОДНАКО, это не всегда вводится правильно * - Мне нужен запрос, чтобы вывести бегунов, которые НЕ имеют ОБОИХ типов записей в гонке.

(* да, я исправляю сторону ввода данных)

Thx

СТРУКТУРА:

RACE TABLE 
 raceID (int)
 runnerID (int)

STOPS TABLE
 runnerID (int)
 stopTypeID (int)  -- fk to stop type
 when (timestamp)
 sequence (smallint)

На самом деле у меня еще ничего нет, потому что я чувствую, что мне нужно ...

базовый Q для получения раннеров и гоночных логов - это

SELECT *
FROM RACES R
JOIN STOPS S ON S.runnerID = R.runnerID
WHERE R.RaceID = 133



RESULTS
1 = start 
2 = check point
3 = rest point
4 = end

RACEID  RUNNERID    STOPTYPEID
133     21      1 
133     21      4
133     21      3
133     21      2
133     21      2
133     21      2
133     21      2
133     21      2
133     23      2
133     23      2
133     23      2
133     23      2
133     23      4

Обратите внимание, что бегуну 23 не хватает типа '1' (начало) Мне нужен список бегунов в гонке, в которых отсутствуют данные ... Если я скажу, что 1 и 4 ТРЕБУЮТСЯ ....

(спасибо, извините, что не опубликовали необходимые данные)

Ответы [ 3 ]

1 голос
/ 28 марта 2012

Небольшое предположение относительно вашей структуры, но:

SELECT RR.RunnerId
FROM Race AS R
INNER JOIN RaceRunners AS RR
  ON <whatever>
LEFT OUTER JOIN Runners AS Starters
  On Starters.ID = RR.RunnersID
  AND Starters.Type = 'StartPoint' -- don't know how you're specifying this.
LEFT OUTER JOIN Runners AS Finishers
  On Finishers.ID = RR.RunnersID
  AND Finishers.Type = 'EndPoint' -- don't know how you're specifying this.
WHERE Starters.<Whatever> IS NULL
OR Finishers.<Whatever> IS NULL
0 голосов
/ 28 марта 2012

Я закончил тем, что использовал это - хотя мне все еще любопытно, было ли это ЛУЧШЕЕ решение ... Я все еще приравниваю «многословный» к «неэффективному» - и я не уверен, что это хороший настрой. Я просто полагаю, что если он запутан и таков в коде, чем должен быть более элегантный способ заявить, что движку SQL будет «нравиться» лучше ..

конечно - ЭТО ОБОРОТНО - в Q работает намного больше фильтрации - я сократил это до минимума для простоты «концепции» - Спасибо

SELECT DISTINCT RaceID, RunnerID 
FROM (
  SELECT 
     raceID
    ,runnerID
    ,(
    SELECT count(stops.ID)
      FROM races
      JOIN stops
     WHERE raceid = main.raceID
       AND STOPTYPEID = 1
) AS poStart
,(
    SELECT count(stops.ID)
      FROM races
      JOIN stops
     WHERE raceid = main.raceID
       AND STOPTYPEID = 4
) AS poEnd


FROM races

WHERE x BETWEEN '2012-03-01 00:00:00.0' AND '2012-03-31 23:59:59.9'

ORDER BY race
) AS T1 WHERE poStart = 0 OR poEnd = 0
0 голосов
/ 28 марта 2012

Вы можете сделать это таким образом, чтобы получить количество остановок для каждого человека в двух ваших типах остановок (начало, конец), это также дает вам столбец, показывающий, была ли у бегуна начальная или конечная регистрация.

create table #race
(
    raceid int,
    runnerid int
)
create table #stops
(
    runnerid int,
    stoptypeid int,
)

insert into #race values(133, 21)
insert into #race values(133, 23)
insert into #race values(133, 20)
insert into #race values(133, 33)

insert into #stops values(21, 1)
insert into #stops values(21, 4)
insert into #stops values(21, 3)
insert into #stops values(21, 2)
insert into #stops values(21, 2)
insert into #stops values(21, 2)
insert into #stops values(21, 2)
insert into #stops values(21, 2)
insert into #stops values(23, 2)
insert into #stops values(23, 2)
insert into #stops values(23, 2)
insert into #stops values(23, 2)
insert into #stops values(23, 4)

insert into #stops values(20, 3)
insert into #stops values(20, 1)

insert into #stops values(33, 4)
insert into #stops values(33, 1)


    SELECT r.raceid
        , r.runnerid
        , (select COUNT(*) 
            FROM #stops s
            WHERE S.runnerID = R.runnerID
                AND s.stoptypeid IN (1, 4)) as StartEndStops
    , CASE WHEN (SELECT COUNT(*) FROM #stops s WHERE S.runnerID = R.runnerID AND s.stoptypeid = 1) = 1 
            THEN 'Start Check-in'
            ELSE ''
        END as 'Start'
    , CASE WHEN (SELECT COUNT(*) FROM #stops s WHERE S.runnerID = R.runnerID AND s.stoptypeid = 4) = 1
            THEN 'End Check-in'
            ELSE ''
        END as 'End'
    FROM #race R    

drop table #race
drop table #stops

Результаты:

RaceId    RunnerId  StartEndStops     Start             End
133       21         2            Start Check-in    End Check-in
133       23         1                              End Check-in
133       20         1            Start Check-in
133       33         2            Start Check-in    End Check-in
...