Я создаю школьный сайт и застрял в этой проблеме.
База данных SQL структурирована следующим образом (у меня нет разрешения изменять их базу данных)
**GroupRecords**
Id (int, primary key)
Name (nvarchar)
SchoolYear (datetime)
RecordDate (datetime)
IsUpdate (bit)
**People**
Id (int, primary key)
GroupRecordsId (int, foreign key to GroupRecords.Id)
Name (nvarchar)
Bio (nvarchar)
Location (nvarchar)
Фактически бумажная форма выглядит так, она обновляется в течение года
Не допускайте дублирования имен участников (People.Name) в одной форме (GroupRecords)
-------------------------
Name: District A
SchoolYear: 2000
RecordDate: 12/30/1999
IsUpdate: no
Participants
Name Location
AA 11
BB 22
CC 33
DD 44
-------------------------
-------------------------
Name: District A
SchoolYear: 2000
RecordDate: 1/2/2000
IsUpdate: no
Participants
Name Location
QQ 33
DD 22
EE 99
FF 66
-------------------------
-------------------------
Name: District A
SchoolYear: 2000
RecordDate: 2/1/2000
IsUpdate: yes
Participants
Name Location
XX 00
-------------------------
-------------------------
Name: District A
SchoolYear: 2000
RecordDate: 2/1/2000
IsUpdate: yes
Participants
Name Location
QQ 44
-------------------------
Теперь вот сложная часть
если IsUpdate - да, то список возвращаемых людей должен объединиться со списком предыдущей записи
(так что если IsUpdate - нет: заменить, если IsUpdate - да: объединить)
, поэтому, если запрос GroupRecords.Name = 'Район 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]
Обновление
позвольте мне прояснить, как работает IsUpdate
формы в примере уже отсортированы по RecordDate в порядке убывания
скажем, существует только первая форма, возвращенный список будет
AA 11
BB 22
CC 33
DD 44
если только первое и форма, возвращаемый список будет
QQ 33
DD 22
EE 99
FF 66
, поскольку isUpdate в последней форме (второй форме) - нет, возвращаемый список будет просто содержимым во 2-й форме
первые 3 формы
QQ 33
DD 22
EE 99
FF 66
XX 00
, поскольку isUpdate в последней форме (3-й форме) - это да, его содержимое добавит / заменит последний список.
скажем, есть пятая форма, как эта
-------------------------
Name: District A
SchoolYear: 2000
RecordDate: 2/10/2000
IsUpdate: no
Participants
Name Location
TT 99
-------------------------
тогда возвращаемые данные будут просто
TT 99