此问题是此question
的延续然而,数据库结构略有变化(因为我略微简化了)
我有一个包含数据列的数据库,如下所示:
Key, Instance, User ID, Day, Size, Instance Type
键 - 这是主键
实例 - 这是特定实例的描述符(这将是唯一的)
用户ID - 这将引用许多用户中的一个,其中该数字将小于此表中的条目数。
日 - 这是特定用户创建此实例的日期。它将是第1天或第2天之一
大小 - 这是存储数据的大小
实例类型 - 有多种实例类型实例本身就是这些实例类型之一。
现在在我之前的问题中,我正在构建一个嵌套的SQL查询,以查找在第1天和第2天具有实例且在此情况下具有特定实例类型的不同用户。
现在我有2组这些查询。
我现在想做的是第三次查询,并返回其他任何查询中都不存在用户ID 的数据库。
到目前为止,我已经设置了一个查询,但它确实很慢(与 On 语句中的<>比较器有关)并且我甚至不能100%确定它正是我想要的。
到目前为止,这是我的SQL语句:
Select Max( Table.Key ) as Key,
Max( Table.Instance ) as Instance,
Table.[User ID],
Max( Table.Day ) as Day,
Max( Table.Size ) as Size,
Max( Table.[Instance Type] ) as [Instance Type]
from (((Table
inner join (Select top 90 Max( Table.Key ) as Key,
Max( Table.Instance ) as Instance,
Table.[User ID],
Max( Table.Day ) as Day,
Max( Table.Size ) as Size,
Max( Table.[Instance Type] ) as [Instance Type]
from Table
where Table.[Instance Type]="type1" and
Table.[Day]=1 and
1=1
group by Table.[User ID]) as t2
on Table.[User ID]<>t2.[User ID])
inner join (Select top 90 Max( Table.Key ) as Key,
Max( Table.Instance ) as Instance,
Table.[User ID],
Max( Table.Day ) as Day,
Max( Table.Size ) as Size,
Max( Table.[Instance Type] ) as [Instance Type]
from Table
where Table.[Instance Type]="type1" and
Table.[Day]=2 and
1=1
group by Table.[User ID]) as t3
on Table.[User ID]<>t3.[User ID])
inner join (Select Table.[User ID]
from Table
where 1=1 ) as t4
on Table.[User ID]=t4.[User ID])
where Table.[Instance Type]="type1"
group by Table.[User ID];
如何获得我所追求的任何帮助或建议将受到大力赞赏!
答案 0 :(得分:1)
这可能会使性能调优变得更容易,首先将其作为临时表进行分块(在MS-Access中,我猜'视图'或'制表',特别是因为您的逻辑看起来过于复杂(因此很难维护和调试!):
您的问题的第1部分:“现在在我之前的问题中,我正在构建一个嵌套的SQL查询,以查找在第1天和第2天具有实例的不同用户,在这种情况下具有特定的实例类型。”
为什么不先使用'临时表/制作表'或'查看'等等(取决于您的实施方式,首先获取当天的用户ID的明确列表。
SELECT DISTINCT Table.UserID, Table.Day
INTO #DistinctListOfUserIDsWithDays /* Not sure of exact syntax in access! */
FROM Table
WHERE Table.Day = 1
OR Table.Day = 2
然后,您可以通过聚合上面的查看/查询结果并使用having子句,让所有拥有两天数据的用户轻松解决您的第一部分:
SELECT Table.UserID, COUNT(*)
FROM #DistinctListOfUserIDsWithDays
HAVING COUNT(*) > 1
Now I have 2 sets of these queries.
re:您的新查询“我现在要做的是第三个查询并返回其他任何查询中不存在用户ID的数据库”,这是一个简单的解决方案,基于原始查询/上面的观点:
SELECT Table.UserID
FROM Table
WHERE UserID NOT IN (SELECT UserID FROM #DistinctListOfUserIDsWithDays)
你也冷同外连接#DistinctListOfUserIDsWithDays与表,并只选择那些在查询的#DistinctListOfUserIDsWithDays一侧返回NULL的UserID ...