Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL语法-having子句?_Sql_Having Clause - Fatal编程技术网

SQL语法-having子句?

SQL语法-having子句?,sql,having-clause,Sql,Having Clause,我应该知道这一点,但我不知道,谁能帮我一个语法plz 假设我在跟踪越野接力赛中的跑步者,我有一个主连接表,将跑步者与比赛关联起来。。。还有一张跑步表,告诉我他们在哪里/什么时候开始跑步,在哪里/什么时候结束。。。沿途还记录了一些检查点 要求每个跑步者都有一个起点和终点,但是,这并不总是正确输入的*-我需要一个查询来找出在比赛中没有这两种输入的跑步者 *是的,我正在解决数据输入方面的问题 Thx 结构: RACE TABLE raceID (int) runnerID (int) STOP

我应该知道这一点,但我不知道,谁能帮我一个语法plz

假设我在跟踪越野接力赛中的跑步者,我有一个主连接表,将跑步者与比赛关联起来。。。还有一张跑步表,告诉我他们在哪里/什么时候开始跑步,在哪里/什么时候结束。。。沿途还记录了一些检查点

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

*是的,我正在解决数据输入方面的问题

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


thx,很抱歉没有发布所需的“数据”

对您的结构略有猜测,但是:

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

您可以通过这种方式获得两种停车类型中每个人的停车次数start,end,这也会为您提供一个列,显示跑步者是否有开始或结束登记

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

我最终使用了这个-尽管我仍然好奇它是否是最好的解决方案。。。 我仍然将“冗长”等同于“低效”——我不确定这是一种好的心态。 我只是想,如果它的代码凌乱不堪,那么就必须有一种更优雅的方式来说明它,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

你能给我们看看你有什么吗?你期待什么?你试过什么?不是都试过。。这是字段1不为空还是字段2不为空?