小编EJF*_*EJF的帖子

用于检查 INSERT 是否成功的 SQL 语法?

我正在处理一项学校作业,该作业希望我将一些新值插入到数据库表中,然后根据 INSERT 是否成功打印一条消息。

问题是这样的:

编写一个脚本,尝试将名为“吉他”的新类别插入到类别表中。如果插入成功,脚本应显示以下消息:成功:记录已插入。

如果更新不成功,脚本应显示如下消息:失败:未插入记录。错误 2627:违反 UNIQUE KEY 约束“UQ_ Categori _8517B2E0A87CE853”。无法在对象“dbo.Categories”中插入重复键。重复的键值为(吉他)。

目前,此类别表包含 2 列:类别 ID 和类别名称。它填充了值

1     Guitars
2     Basses
3     Drums
4     Keyboards 
Run Code Online (Sandbox Code Playgroud)

显然,问题希望您插入的吉他类别已经存在,所以我猜这个问题的重点是让它打印错误消息。这个问题的逻辑似乎相当简单。将吉他类别插入表中。如果插入成功,则打印诸如此类。如果不成功,打印某某。我只是不确定语法。这是我到目前为止的 SQL 代码:

USE MyGuitarShop;

INSERT INTO Categories (CategoryID, CategoryName)
VALUES (5, 'Guitars')

IF (          ) --insert is successful
    PRINT 'SUCCESS: Record was inserted'
ELSE --if insert is unsuccessful
    PRINT 'FAILURE: Record was not inserted.'
    PRINT 'Error 2627: Violation of UNIQUE KEY constraint 'UQ__Categori__8517B2E0A87CE853'.' 
    PRINT 'Cannot insert duplicate key in object 'dbo.Categories'. The duplicate key …
Run Code Online (Sandbox Code Playgroud)

sql database sql-server insert sql-server-2012

6
推荐指数
1
解决办法
2万
查看次数

(一年前)和(现在)之间的日期

我正在处理一个查询,我需要提取日期在现在和一年前之间的所有结果。因此,如果明天运行查询,结果将与今天运行的结果略有不同。如果我今天运行它,基本上就像在说“日期在 2015 年 6 月 1 日到 2016 年 6 月 1 日之间”。明天,2015 年 6 月 2 日至 2016 年 6 月 2 日,依此类推。

我想我可以将其格式化为与涉及日期的常规子句相同的格式WHERE。这就是我所拥有的:

WHERE CreateDate BETWEEN (DATEADD(Year,-1,GETDATE()) AND (GetDATE())
Run Code Online (Sandbox Code Playgroud)

首先,我不确定该DATEADD()部分是否是我应该使用的——我只是根据我在另一个论坛上阅读的内容进行了尝试。其次,我有一个红色的波浪线告诉我在 附近有一个语法错误AND

解决这个问题的最佳方法是什么?

sql sql-server

1
推荐指数
1
解决办法
2万
查看次数

SQL:如何仅选择最旧的记录

我意识到这是一个以前被问过的问题,但在调查这些帖子后,没有一个完全符合我正在研究的内容。

我有一个访问过某个地点的人的列表,其中许多人已经访问过多次。每个人都有一个唯一的 ID,每次访问都有一个日期和状态(我只查看状态为“未更改”的访问,而不是“取消”、“重新安排”等状态)。我需要做的是只为每个人选择最旧的记录。换句话说,仅查看他们第一次访问的日期。

我以前解决过这样的问题,然后我回去找到了我的旧代码并尝试将其应用于这种特殊情况。问题是,当时,我试图提取给定人员的最新记录,但我不确定如何更改此处的内容以应用于最旧的记录。如果一个人访问了 3 次,而另一个人访问了 7 次,我不知道如何处理我的seqnum变量。

另外,如果我按照当前的方式运行此代码,我仍然会为每个人获取多个记录,这完全是另一个问题。至少未改变访问的过滤器正在工作。

有什么想法吗?

SELECT DISTINCT
  PersonID,
  PersonName,
  VisitDate,
  Status,
  VisitType

FROM (SELECT VisitInfo.*,
      ROW_NUMBER() OVER (PARTITION BY PersonID, VisitDate ORDER BY VisitDate DESC) as seqnum
      FROM VisitInfo
      WHERE Status = 'Unchanged'

      ) VisitInfo

WHERE seqnum = 1
ORDER BY VisitDate
Run Code Online (Sandbox Code Playgroud)

sql sql-server

0
推荐指数
1
解决办法
2379
查看次数

当不存在行时,LEFT JOIN 不返回 null

我正在使用 2 个表:1 个表处理一组人的基本人口统计数据,1 个表处理已完成的活动。我需要做的是从人口统计表中提取所有结果(所有人),然后显示在给定时间范围内完成某种类型活动的任何人的活动信息(给定的人也可能完成了多项活动)在那个时间范围内)。如果某人尚未完成任何指定的活动,我仍然希望他们在列表中可见。我希望结果如下所示:

PersonID  Name           DateOfBirth   ActivityDate   ActivityType
---------------------------------------------------------------------
1001      John Smith     01/01/1990    10/18/2022     Painting
1002      Jane Doe       12/31/1980    NULL           NULL
1003      Bob Brown      07/04/1995    10/17/2022     Reading
1003      Bob Brown      07/04/1995    09/09/2022     Painting
1004      Mike Jones     03/24/1984    NULL           NULL
1005      Ann Green      11/30/1988    08/29/2022     Writing
1006      Sally Black    05/15/1999    NULL           NULL
Run Code Online (Sandbox Code Playgroud)

看起来这应该是LEFT JOIN两个表之间非常简单的查询:

SELECT DISTINCT
    d.PersonID,
    d.Name
    d.DateOfBirth,
    a.ActivityDate
    a.ActivityType
FROM Demographics d
LEFT JOIN Activity a ON d.PersonID = a.PersonID
WHERE ActivityDate BETWEEN DATEADD(yy,-1,GETDATE()) AND …
Run Code Online (Sandbox Code Playgroud)

sql sql-server join left-join

-1
推荐指数
1
解决办法
202
查看次数

标签 统计

sql ×4

sql-server ×4

database ×1

insert ×1

join ×1

left-join ×1

sql-server-2012 ×1