2012-03-28 47 views
-1

我应该知道这一点 - 但我不知道,任何人都可以帮我一个语法PLZ。SQL语法 - 有子句?

比方说,我正在跟踪越野接力赛中的跑步者,我有一个与跑步者相关的主要连接表......以及一张跑步表,告诉我他们在哪里/何时开始他们的腿,何时/何时结束......还有沿路线记录的检查点。

这是一个要求,每个运动员都有一个开始和结束点 - 然而,这并不总是正确输入* - 我需要一个查询来拉出没有在比赛中的两种类型的条目的跑步者。

(*是我固定的东西数据输入端)

THX

结构:

RACE TABLE 
raceID (int) 
runnerID (int) 

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

我真的不 “拥有” 什么yet-因为我我需要什么样的...

获得跑步者和跑日志的基本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

你能告诉我们你有什么吗?你期望什么?你试过了什么? – Arion 2012-03-28 13:46:41

+0

not both .. would that'WHERE(field1 IS NOT NULL OR field2 IS NOT NULL)'? – Konerak 2012-03-28 13:48:01

回答

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 
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 
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