SQL 服务器 Reference/Lookup 表和更新
SQL Server Reference/Lookup Tables and Updates
我有两个 SQL tables:TableA 和 LookupTable。 TableA将LookupTableID(PK)存储为外键和一些其他字段。 LookupTable 存储 LookupTableID、PharmacyName、PharmacyAddress、PostCode、PharmacyTelephone、PharmacyFax、PharmacyEmail 等
来自 TableA 的数据以 Asp.net 形式显示。表格的每一行都有两个按钮:打印按钮和预览按钮。当用户单击“打印”按钮时,包含来自 LookupTable 的药房信息(对于 TableA 中的 LookupTableID)以及来自 TableA 的一些其他信息的 pdf 文档是文件中产生。此外,TableA中的Printed字段设置为true,并在TableA中创建了一条新记录,打印记录与新建记录的唯一区别在于以下字段:StartDate,结束日期和打印。新建记录中StartDate变为"EndDate from printed record + 1 Day",EndDate变为"EndDate from printed record + 7 days",新建记录Printed为false
当用户单击“预览”按钮时,一个 pdf 文档包含来自 LookupTable 的药房信息(对于 TableA 中的 LookupTableID)以及来自 TableA在文档中产生。请注意,在这种情况下,系统不会创建新记录或将 printed 设置为 true。
我在上述数据库设计中遇到的问题是:如果其中一列让查找 Table 中的邮政编码被修改,并且用户单击 historical/printed 记录的预览按钮,则预览pdf 文档将显示最新信息,即新的 post 代码,而不是打印时的 post 代码。我知道,这是预期的行为。但是,我想在打印时显示历史记录的信息,而只显示那些尚未打印的记录的最新信息。
我的一个解决方法是将 LookupTable 视为图书馆 table 供用户 select 药房,然后复制所有内容(查找中的所有字段 table) 穿过 TableA 的 selected 药房。这将在数据库中创建大量重复数据。有没有更好的方法来实现我的objective?任何帮助将不胜感激。
对于历史数据,有(至少)两种方法:
- 您使用
ValidUntil
日期存储您的信息。带NULL的就是当前的。
可以通过类似以下内容找到较旧的数据:
DECLARE @test TABLE(id INT,ValidUntil DATETIME);
INSERT INTO @test VALUES(1,{d'2015-01-01'})
,(2,{d'2015-02-01'})
,(3,{d'2015-03-01'})
,(4,NULL);
DECLARE @ValidOn DATETIME={d'2015-01-02'}; --set any value you like, even NULL
WITH HelperDates AS
(
SELECT ISNULL(@ValidOn,GETDATE()) AS ValidOn
,(SELECT MAX(ValidUntil) FROM @test) AS MaxDate
)
SELECT TOP 1 tbl.*
FROM @test AS tbl
CROSS JOIN HelperDates AS hd
WHERE hd.MaxDate IS NULL OR hd.ValidOn > hd.MaxDate OR hd.ValidOn <= tbl.ValidUntil
ORDER BY tbl.ValidUntil ASC
尤其是印刷品我更喜欢这种方式
- 在创建文档时存储必要的数据。在我看来,最好的是 XML 列和创建的文档。
祝您找到最佳方法!
这似乎是一种不必要的复杂且不灵活的方式,每次打印数据时都会对数据进行快照。似乎更好的替代方法是对两个 table 进行版本化并创建第三个 table,它只包含 TableA ID 和它的打印日期。无需复制数据。要重现任何特定打印日期的数据,只需使用打印日期查询截至该日期的版本化数据。您将取回该日期出现的数据,无论此后数据发生了多大变化。
这里是我针对类似情况给出的一个答案:
希望对您有所帮助。
我有两个 SQL tables:TableA 和 LookupTable。 TableA将LookupTableID(PK)存储为外键和一些其他字段。 LookupTable 存储 LookupTableID、PharmacyName、PharmacyAddress、PostCode、PharmacyTelephone、PharmacyFax、PharmacyEmail 等
来自 TableA 的数据以 Asp.net 形式显示。表格的每一行都有两个按钮:打印按钮和预览按钮。当用户单击“打印”按钮时,包含来自 LookupTable 的药房信息(对于 TableA 中的 LookupTableID)以及来自 TableA 的一些其他信息的 pdf 文档是文件中产生。此外,TableA中的Printed字段设置为true,并在TableA中创建了一条新记录,打印记录与新建记录的唯一区别在于以下字段:StartDate,结束日期和打印。新建记录中StartDate变为"EndDate from printed record + 1 Day",EndDate变为"EndDate from printed record + 7 days",新建记录Printed为false
当用户单击“预览”按钮时,一个 pdf 文档包含来自 LookupTable 的药房信息(对于 TableA 中的 LookupTableID)以及来自 TableA在文档中产生。请注意,在这种情况下,系统不会创建新记录或将 printed 设置为 true。
我在上述数据库设计中遇到的问题是:如果其中一列让查找 Table 中的邮政编码被修改,并且用户单击 historical/printed 记录的预览按钮,则预览pdf 文档将显示最新信息,即新的 post 代码,而不是打印时的 post 代码。我知道,这是预期的行为。但是,我想在打印时显示历史记录的信息,而只显示那些尚未打印的记录的最新信息。
我的一个解决方法是将 LookupTable 视为图书馆 table 供用户 select 药房,然后复制所有内容(查找中的所有字段 table) 穿过 TableA 的 selected 药房。这将在数据库中创建大量重复数据。有没有更好的方法来实现我的objective?任何帮助将不胜感激。
对于历史数据,有(至少)两种方法:
- 您使用
ValidUntil
日期存储您的信息。带NULL的就是当前的。
可以通过类似以下内容找到较旧的数据:
DECLARE @test TABLE(id INT,ValidUntil DATETIME);
INSERT INTO @test VALUES(1,{d'2015-01-01'})
,(2,{d'2015-02-01'})
,(3,{d'2015-03-01'})
,(4,NULL);
DECLARE @ValidOn DATETIME={d'2015-01-02'}; --set any value you like, even NULL
WITH HelperDates AS
(
SELECT ISNULL(@ValidOn,GETDATE()) AS ValidOn
,(SELECT MAX(ValidUntil) FROM @test) AS MaxDate
)
SELECT TOP 1 tbl.*
FROM @test AS tbl
CROSS JOIN HelperDates AS hd
WHERE hd.MaxDate IS NULL OR hd.ValidOn > hd.MaxDate OR hd.ValidOn <= tbl.ValidUntil
ORDER BY tbl.ValidUntil ASC
尤其是印刷品我更喜欢这种方式
- 在创建文档时存储必要的数据。在我看来,最好的是 XML 列和创建的文档。
祝您找到最佳方法!
这似乎是一种不必要的复杂且不灵活的方式,每次打印数据时都会对数据进行快照。似乎更好的替代方法是对两个 table 进行版本化并创建第三个 table,它只包含 TableA ID 和它的打印日期。无需复制数据。要重现任何特定打印日期的数据,只需使用打印日期查询截至该日期的版本化数据。您将取回该日期出现的数据,无论此后数据发生了多大变化。
这里是我针对类似情况给出的一个答案:
希望对您有所帮助。