复杂SQL查询,不包括其他SQL查询的结果

时间:2013-10-08 12:49:09

标签: sql ms-access

此问题是此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];

如何获得我所追求的任何帮助或建议将受到大力赞赏!

1 个答案:

答案 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 ...