Синтаксис SQL - есть предложение?
Я должен знать это - но я не знаю, может кто-нибудь помочь мне с синтаксисом плз.
Допустим, я отслеживаю бегунов в эстафете по пересеченной местности, у меня есть основной стол соединения, который связывает бегунов с гонками... и таблица бегунов, которая сообщает мне, где / когда они начали свою ногу и где / когда они закончились... есть также контрольно-пропускные пункты, которые регистрируются вдоль маршрута.
Это требование, чтобы у каждого бегуна была начальная и конечная точка - ОДНАКО, это не всегда вводится правильно * - мне нужен запрос, чтобы вытащить бегунов, которые НЕ имеют ОБОИХ типов записей в гонке.
(* да, я исправляю сторону ввода данных)
Спасибо
СОСТАВ:
RACE TABLE
raceID (int)
runnerID (int)
STOPS TABLE
runnerID (int)
stopTypeID (int) -- fk to stop type
when (timestamp)
sequence (smallint)
У меня пока ничего нет, потому что я чувствую себя так, как мне нужно...
основной вопрос, чтобы получить бегунов и гоночные журналы это
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 ответа
Небольшое предположение относительно вашей структуры, но:
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
Я закончил тем, что использовал это - хотя мне все еще любопытно, было ли это ЛУЧШИМ решением... Я все еще приравниваю "многословный" к "неэффективному" - и я не уверен, что это хороший настрой. Я просто полагаю, что если он запутан и таков в коде, то должен быть более элегантный способ сказать, что движку 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
Вы можете сделать это таким образом, чтобы получить количество остановок для каждого человека в двух типах остановок (начало, конец), это также дает вам столбец, показывающий, прошел ли бегун начальную или конечную регистрацию.
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