我正在处理一项学校作业,该作业希望我将一些新值插入到数据库表中,然后根据 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) 我正在处理一个查询,我需要提取日期在现在和一年前之间的所有结果。因此,如果明天运行查询,结果将与今天运行的结果略有不同。如果我今天运行它,基本上就像在说“日期在 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。
解决这个问题的最佳方法是什么?
我意识到这是一个以前被问过的问题,但在调查这些帖子后,没有一个完全符合我正在研究的内容。
我有一个访问过某个地点的人的列表,其中许多人已经访问过多次。每个人都有一个唯一的 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) 我正在使用 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)