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 - Fatal编程技术网

复杂sql查询-合并或替换组

复杂sql查询-合并或替换组,sql,sql-server,Sql,Sql Server,我正在建立一个学校网站,并陷入了这个问题 SQL数据库的结构如下(我没有修改其数据库的权限) 实际的纸质表单如下所示,它全年都在更新 假设同一表单(GroupRecords)中没有重复的参与者姓名(People.Name) 现在是棘手的部分 如果IsUpdate为yes,则返回的人员列表应与上一条记录的列表合并 (如果IsUpdate为否:替换,如果IsUpdate为是:合并) 因此,如果查询是GroupRecords.Name='District A'和GroupRecords.SchoolY

我正在建立一个学校网站,并陷入了这个问题

SQL数据库的结构如下(我没有修改其数据库的权限)

实际的纸质表单如下所示,它全年都在更新 假设同一表单(GroupRecords)中没有重复的参与者姓名(People.Name)

现在是棘手的部分 如果IsUpdate为yes,则返回的人员列表应与上一条记录的列表合并 (如果IsUpdate为否:替换,如果IsUpdate为是:合并)

因此,如果查询是GroupRecords.Name='District A'和GroupRecords.SchoolYear='1/1/2000',我应该得到

QQ   44
DD   22
EE   99
FF   66
XX   00
可能最好为此编写一个存储过程,对吗? 多谢各位

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[GroupRecords](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](500) NOT NULL,
    [SchoolYear] [datetime] NOT NULL,
    [RecordDate] [datetime] NOT NULL,
    [IsUpdate] [bit] NOT NULL,
 CONSTRAINT [PK_GroupRecords] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[People](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [GroupRecordsId] [int] NOT NULL,
    [Name] [nvarchar](500) NOT NULL,
    [Bio] [nvarchar](4000) NOT NULL,
    [Location] [nvarchar](100) NOT NULL,
 CONSTRAINT [PK_People] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[People]  WITH CHECK ADD  CONSTRAINT [FK_People_GroupRecords] FOREIGN KEY([GroupRecordsId])
REFERENCES [dbo].[GroupRecords] ([Id])
GO
ALTER TABLE [dbo].[People] CHECK CONSTRAINT [FK_People_GroupRecords]
更新 让我澄清一下iUpdate是如何工作的

示例中的表单已按记录日期按顺序排序 如果只存在第一个表单,则返回的列表将为

AA   11
BB   22
CC   33
DD   44
QQ   33
DD   22
EE   99
FF   66
如果只有第一个和表单,则返回的列表将是

AA   11
BB   22
CC   33
DD   44
QQ   33
DD   22
EE   99
FF   66
因为最新表单(第二个表单)中的isUpdate是no,所以返回的列表将只是第二个表单中的内容

前3张表格

QQ   33
DD   22
EE   99
FF   66
XX   00
因为最新表单(第三个表单)中的isUpdate是yes,所以它的内容将添加/替换最后一个列表

比如说有第五张这样的表格

-------------------------
Name: District A
SchoolYear: 2000
RecordDate: 2/10/2000
IsUpdate: no

Participants
Name Location
TT   99
-------------------------
然后返回的数据将只是

TT   99

我看到了一种趋势。。。您想学习如何在您尝试使用的应用程序的上下文中使用数据库,还是想发布问题并让我们告诉您答案?这两种方式都可以处理,但是你应该非常清楚地发布你想要的内容


这可能会变得复杂,因此您可能希望发布一个非常完整的模式。

我看到了一个趋势。。。您想学习如何在您尝试使用的应用程序的上下文中使用数据库,还是想发布问题并让我们告诉您答案?这两种方式都可以处理,但是你应该非常清楚地发布你想要的内容


这可能会变得复杂,因此您可能需要发布一个相当完整的模式。

在我看来,数据库的设计似乎有问题

如果有三张桌子的话,看起来更符合逻辑

为个人提供一个
此表应具有以下字段

Id(整数,主键)
名称(nvarchar)
生物(nvarchar)
位置(nvarchar)

一组一个
此表应具有以下字段

Id(整数,主键)
姓名(nvarchar) 学年(日期时间)

一对关联人员和团体

Id
GroupId
PersonId
记录日期

这样,如果需要向组中添加人员,只需将其插入人员组表中即可

如果需要历史记录,只需在person group表中添加一个字段,指示记录的状态(当前、已删除等)

按照当前数据库的设计方式,一个人不能在多个组中。此外,对个人组的任何更改都是以破坏性的方式进行的(除非您复制了个人,这是不好的)

如果您需要一份人员之前所在组的书面记录,您还可以需要更多表格来保存历史记录


不应在数据库中使用IsUpdate字段,而应编辑数据。MS Sql是一个数据库服务器,数据库需要更新。

在我看来,数据库的设计似乎有问题

如果有三张桌子的话,看起来更符合逻辑

为个人提供一个
此表应具有以下字段

Id(整数,主键)
名称(nvarchar)
生物(nvarchar)
位置(nvarchar)

一组一个
此表应具有以下字段

Id(整数,主键)
姓名(nvarchar) 学年(日期时间)

一对关联人员和团体

Id
GroupId
PersonId
记录日期

这样,如果需要向组中添加人员,只需将其插入人员组表中即可

如果需要历史记录,只需在person group表中添加一个字段,指示记录的状态(当前、已删除等)

按照当前数据库的设计方式,一个人不能在多个组中。此外,对个人组的任何更改都是以破坏性的方式进行的(除非您复制了个人,这是不好的)

如果您需要一份人员之前所在组的书面记录,您还可以需要更多表格来保存历史记录


不应在数据库中使用IsUpdate字段,而应编辑数据。MS Sql是一个数据库服务器,数据库是要更新的。

您能用真实的数据值再次讨论它吗?二十、 AA等可能是“史密斯”、“琼斯”。对于组、位置等的现有值,它们各自可能有什么


然后以一个IsUpdate表单为例,展示结果。然后,对于相同的表单,切换到IsUpdate=false,并显示不同的结果?

您能用真实的数据值再次讨论它吗?二十、 AA等可能是“史密斯”、“琼斯”。对于组、位置等的现有值,它们各自可能有什么


然后以一个IsUpdate表单为例,展示结果。然后,对于相同的表单,切换到IsUpdate=false,并显示不同的结果?

我希望尽可能多地了解数据库设计。将用完整的模式更新帖子。我希望尽可能多地了解数据库设计。如果你稍微简化一下你的问题,我会用完整的方案更新帖子。例如,省去不需要的字段,关注您想要的内容的本质