Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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查询出错_Sql_Sql Server_Database_Relational Database - Fatal编程技术网

单个SQL查询出错

单个SQL查询出错,sql,sql-server,database,relational-database,Sql,Sql Server,Database,Relational Database,我正在尝试为我的数据库编写一个SQL查询,该查询将检索所有特定用户事件。如果它们被标记为重复出现,我希望它们在开始日期后的52周内每周出现。有更好的方法吗?我目前的代码似乎相当笨拙 我的表格结构如下: event ( event_id INT NOT NULL AUTO_INCREMENT, (PK) title VARCHAR(80) NOT NULL, description VARCHAR(200), event_start DATETIME,

我正在尝试为我的数据库编写一个SQL查询,该查询将检索所有特定用户事件。如果它们被标记为重复出现,我希望它们在开始日期后的52周内每周出现。有更好的方法吗?我目前的代码似乎相当笨拙

我的表格结构如下:

   event (
    event_id INT NOT NULL AUTO_INCREMENT, (PK)
    title VARCHAR(80) NOT NULL,
    description VARCHAR(200),
    event_start DATETIME,
    event_end DATETIME,
    group_id INT NOT NULL,
    recurring BOOLEAN
);

   Users{
    UserID (PK)
    Username
   }

   Groups{
    GroupID (PK)
    GroupName
   }

   Membership{
    UserID (FK)
    GroupID (FK)
   }
这是我目前的查询,它目前不起作用,有人能帮我吗

 var result = db.Query(
            @"SELECT e.event_id, e.title, e.description, e.event_start, e.event_end, e.group_id, e.recurring
            FROM   event e
            JOIN   Membership m ON m.GroupID = e.group_id
            WHERE  e.recurring
            AND    m.UserID = ?
            AND    e.event_start >= ?
            AND    e.event_end <= ?
            UNION ALL
            SELECT e.event_id, e.title, e.description, DATEADD(week, w.weeks, e.event_start),
                   DATEADD(week, w.weeks, e.event_end), e.group_id, e.recurring
            FROM   event e
            JOIN   Membership m ON m.GroupID = e.group_id,
            (SELECT row_number() OVER (ORDER BY Object_ID) AS weeks
                    FROM SYS.OBJECTS) AS w
            WHERE  NOT e.recurring
            AND    m.user_id = ?
            AND    e.event_start >= ?
            AND    e.event_end <= ?", username, start, end, username, start, end
        );
有人能帮我调整代码,使其选择所有非重复事件,并在52周内同时选择重复事件吗?

可能如下所示:

SELECT e.event_id, e.title, e.description, e.start_time, e.end_time
     , e.group_id, e.recurring
FROM   Events e
JOIN   Membership m ON m.groupid = e.group_id
WHERE  e.recurring = 0 
AND    m.user_id = ?
AND    e.start_time >= ?
AND    e.end_time <= ?

UNION ALL
SELECT e.event_ID, e.title, e.description
      ,DATEADD(week, w.weeks, e.start_time) -- AS event_start
      ,DATEADD(week, w.weeks, e.end_time)   -- AS event_end
      ,e.group_id, e.recurring
FROM   Events e
JOIN   Membership m ON m.groupid = e.group_id
      ,(SELECT row_number() OVER (ORDER BY Object_ID) AS weeks
        FROM SYS.OBJECTS) AS w
WHERE  e.recurring = 1
AND    m.user_id = ?
AND    e.start_time >= ?
AND    e.end_time <= ?
使用UNION ALL而不是UNION

事件开始和事件结束,而不是开始和结束时间??我改了

一开始我也没有注意到这一点:user_id位于表成员身份中,所以如果您想在WHERE子句中使用它,就需要将其加入。外键列似乎是group\u id/groupid。我会统一拼写

您在查询的第一部分中选择了*。最好在这样的查询中拼写出列名,否则稍后对基础表的更改将以令人惊讶的方式破坏它

我的第一个草稿有一个辅助函数generate_series来生成1-52的数字集,但是您原来的解决方案更好,所以我恢复了这个更改


试试这个。您在SQL中使用了event_start和event_stop,但它们没有在Events表中定义。你唯一搞混的是开始时间=@CurrentTime。我认为你的代码并不笨拙。UNION ALL的性能优于UNION UNION的工作方式,如DISTINCT:first ORDER BY,然后删除重复项

DROP TABLE #Events
CREATE TABLE #Events (
  event_id  INT NOT NULL,
  title VARCHAR(80) NOT NULL,
  description   VARCHAR(200),
  start_time    DATETIME,
  end_time  DATETIME,
  group_id  INT NOT NULL,
  recurring bit
);

INSERT INTO #Events(event_id, title, description, start_time, end_time, group_id, recurring) VALUES
(1, 'meeting1', 'meeting1', '20000101', '20000102', 1, 0),
(2, 'meeting2', 'meeting2', '20120309', '20120310', 1, 0),
(3, 'meeting3', 'meeting3', '20120311', '20120312', 1, 0),
(10, 'meeting10', 'meeting10', '20000101', '20000102', 1, 1),
(20, 'meeting20', 'meeting20', '20120309', '20120310', 1, 1),
(30, 'meeting30', 'meeting30', '20120311', '20120312', 1, 1)

DECLARE @CurrentTime DATETIME
SET @CurrentTime = GETDATE()

SELECT event_id, 
    title,
    description, 
    start_time, 
    end_time, 
    group_id, 
    recurring
FROM #Events 
WHERE recurring = 0 AND 
--  user_id = ? AND 
  start_time <= @CurrentTime AND 
  end_time >= @CurrentTime

UNION ALL

SELECT event_ID, 
  title, 
  description, 
  DATEADD(WEEK, Interval, start_time) [event_start], 
  DATEADD(WEEK, Interval, end_time) [event_end], 
  group_id, 
  recurring
FROM #Events,
  (SELECT ROW_NUMBER() OVER(ORDER BY Object_ID) [Interval]
  FROM SYS.OBJECTS) as T 
WHERE recurring = 1 AND 
  Interval <= 52 AND 
--  user_id = ? AND 
  start_time <= @CurrentTime AND 
  end_time >= @CurrentTime
;

请记住,一年没有52周。52.177457周!不过,四舍五入比较容易,不是吗我看到过这样的系统,在今年没有52周的时间里,又有几次骇人听闻的骇人听闻的骇人听闻的骇客。希望我能在我的情况下避免这种情况您的查询的实际结果与期望的结果有何不同?我应该在代码中的何处添加函数generate_series以集成该函数?非常感谢您的回复-当您显示辅助功能时,我有点不知所措了!:@西蒙基利:对不起,这个辅助功能实际上是不必要的。您最初的解决方案更简单。我还原了更改。Brandstetter,您好,我尝试将此代码集成到我的系统中,并得到错误:解析查询时出错。[Token line number=4,Token line offset=13,Token in error=和]]我已经更新了上面的代码,以准确显示我正在运行的内容-用户名是字符串,开始和结束是日期时间。我认为错误在于用户id列位于查询的事件表之外的另一个表中。您好,感谢您的回复。这很有帮助。目前我遇到的问题是,user_id列包含在membership表中。我只想检索与组id包含其用户id的用户相关的事件-因此成员资格表将包含一个组id和几个用户id,显示特定组的所有用户。如果在事件中使用组id,则我只希望检索其中一个用户的事件。>如果在事件中使用组id,则我只希望检索其中一个用户的事件。<组id不为NULL,它将始终在事件中使用。