-1

我应该知道这一点 - 但我不知道,任何人都可以帮助我使用语法 plz。

假设我正在跟踪越野接力赛中的跑步者,我有一个将跑步者与比赛相关联的主连接表......还有一个跑步者表,告诉我他们在哪里/何时开始他们的腿以及他们在哪里/何时结束了……沿途还记录了检查点。

这是要求每个跑步者都有一个起点和终点 - 但是,这并不总是正确输入* - 我需要一个查询来拉出在比赛中没有两种类型条目的跑步者。

(*是的,我正在修复事物的数据输入方面)

谢谢

结构体:

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 是必需的......

(谢谢,很抱歉没有发布所需的“数据”)

4

3 回答 3

1

稍微猜测一下你的结构,但是:

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
于 2012-03-28T13:50:06.620 回答
0

我最终使用了这个——尽管我仍然很好奇它是否是最好的解决方案......我仍然将“冗长”与“低效”等同起来——我不确定这是一个好的心态。我只是想如果它在代码中是杂乱无章的,那么就必须有一种更优雅的方式来说明 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
于 2012-03-28T15:28:54.410 回答
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
于 2012-03-28T14:51:47.217 回答