简化说明:我有三个主要表:customer、phone 和customer_phone 来解决多对多问题。我需要确保只有管理员才能在未经批准的情况下插入/更新这些表。其他所有人都需要将他们的东西放入批准队列,以便管理员批准。管理员需要在批准/拒绝之前查看当前值和提议的更改。系统应该在审计跟踪中记录谁提交了信息,谁批准了它(如果适用),以及任何修改它的人。当前采用的方法为每个实体提供三个表:
我认为应该有一些更简单的解决方案。当前系统在以下情况下存在问题:
这对我来说似乎不是最佳解决方案。有没有更好的办法?
更长的解释:这是场景的简化视图:我有一个主要实体和次要实体通过链接表链接到它。管理员可以随意添加/编辑任何实体,但标准用户必须在更改生效之前获得管理员的批准。问题是,有时当标准用户输入主实体和链接实体时,管理员必须先批准主实体,链接才能生效。我希望管理员能够在批准之前查看旧值和提议的新值,并且我希望确保他们首先批准主要实体。例如,假设我们有下表,客户是主要实体,电话是次要实体,然后有一个链接表来解决多对多关系:
CREATE TABLE [dbo].[customer](
[Customer_ID] [int] NOT NULL,
[Customer_Name] [varchar](255) NOT NULL,
PRIMARY KEY CLUSTERED ([Customer_ID] ASC)
CREATE TABLE [dbo].[phone](
[Phone_ID] [int] NOT NULL,
[Phone_Number] [int] NOT NULL,
PRIMARY KEY CLUSTERED ([Phone_ID] ASC)
CREATE TABLE [dbo].[customer_phone](
[Customer_Phone_ID] [int] NOT NULL,
[Customer_ID] [int] NOT NULL,
[Phone_ID] [int] NOT NULL,
[Approved] [char](1) NOT NULL, --Y/N
PRIMARY KEY CLUSTERED ([Phone_ID] ASC)
Run Code Online (Sandbox Code Playgroud)
现在,只有管理员才能在未经批准的情况下添加客户或电话号码。如果标准用户想要添加某人,它会进入一个保留表。这就是目前在我的系统中的样子。除了以上表格:
CREATE TABLE [dbo].[customer_holding](
[Customer_ID] [int] NOT NULL,
[Customer_Name] [varchar](255) …
Run Code Online (Sandbox Code Playgroud) 我有一个带有列Type, Login,
和Timestamp
. 已收集有关用户登录到与系统浏览器的类型信息年。显然,许多用户已经升级了他们的浏览器。当用户升级时,我不想考虑旧浏览器的数据。这是我目前必须计算有多少人使用哪种浏览器的查询:
select
Type,
count(Type) as Count
from
(select
distinct Login,
Type
from BROWSER) as q
group by Type
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但我有很多我知道不再使用的旧浏览器:
我如何仅根据时间戳选择每个用户使用的最新浏览器(或者 Browser_ID 也可以工作,因为它们是按顺序编写的)。我也打算忽略过去一年中没有登录的用户的数据,但这很容易在以后添加(我只是提到它,所以没有人提出为什么我想要不活跃用户的旧浏览器数据 - 我也计划解决这个问题,但我已经知道如何做到这一点)。
如果有人愿意接受挑战,有些用户会从几台不同的计算机登录 - 或者可能是从他们的电话和办公桌上登录。如果我能确定他们经常从两个不同的地方登录并收集这些数据,那就太好了,但这可能太复杂了。如果有人想出如何添加这个复杂的步骤,我很乐意为答案奖励 50 分。
我有一个主 ID 列,但对于该行的每次编辑,还有一个序列 ID 列(初始行为 1,每次编辑都会增加序列 ID,但主 ID 列保持不变)。在查询中仅选择最新(最大序列 ID)行的最佳方法是什么?我目前以编程方式执行此操作,但想知道是否有办法在使用 SQL 的一个查询中完成所有操作。
样本数据:
Person_ID Person_Seq_ID Person_Name Person_Favorite_Color
--------- ------------- ----------- ---------------------
1 1 John Doe Green
1 2 John Doe Turquoise
2 1 Jane Doe Blue
3 1 Mike Smith Red
Run Code Online (Sandbox Code Playgroud)
假设我有这个查询:
SELECT * FROM Person
Run Code Online (Sandbox Code Playgroud)
我只希望John Doe
返回最近的行(在本例中为序列 ID #2),并且还应返回 Jane 和 Mike 的单行。
预期结果:
Person_ID Person_Seq_ID Person_Name Person_Favorite_Color
--------- ------------- ----------- ---------------------
1 2 John Doe Turquoise
2 1 Jane Doe Blue
3 1 Mike Smith Red …
Run Code Online (Sandbox Code Playgroud)