-1

这个问题是这个问题的延续

然而,数据库结构略有变化(因为我稍微简化了一点)

我有一个数据列如下的数据库:

Key, Instance, User ID, Day, Size, Instance Type

- 这是主键。
实例- 这是特定实例的描述符(这将是唯一的)。
用户 ID - 这将是指用户数量中的 1 个,其数量将少于此表中的条目数。
Day - 这是特定用户创建此实例的日期。它将是第 1 天或第 2 天之一。
大小- 这是存储数据的大小。
实例类型- 有几种实例类型 实例本身将是这些实例类型之一。

现在,在我之前的问题中,我正在构建一个嵌套 SQL 查询来查找在第 1 天和第 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];

任何有关如何获得我所追求的帮助或建议将不胜感激!

4

1 回答 1

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

然后,您可以通过聚合上面的视图/查询的结果并使用 have 子句来获取所有拥有这两天数据的用户,这很容易解决您的第一部分:

SELECT Table.UserID, COUNT(*)
FROM #DistinctListOfUserIDsWithDays
HAVING COUNT(*) > 1
Now I have 2 sets of these queries.

回复:您的新查询,“我现在想做的是第三个查询并返回其他查询中不存在用户 ID 的数据库”,这是一个简单的解决方案,基于上面的原始查询/视图:

SELECT Table.UserID
FROM Table 
WHERE UserID NOT IN (SELECT UserID FROM #DistinctListOfUserIDsWithDays)

您还可以将#DistinctListOfUserIDsWithDays 与表进行外部连接,并仅选择在查询的#DistinctListOfUserIDsWithDays 端返回NULL 的那些用户ID...

于 2013-10-08T13:07:44.017 回答