2013-10-01 42 views
1

因为我已经使用它很长一段时间了,所以我在SQL上很生疏,即使有,我也很少需要执行复杂的查询。复杂的复合SQL查询

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

Key, Instance, User ID, Day, Size 

重点 - 这是主键。
实例 - 这是特定实例的描述符(这将是唯一的)。
用户ID - 这将引用多个用户中的一个,其中该数字将小于此表中的条目数。
日期 - 这是特定用户创建此实例的那天。这将是第1天或第2天之一。
大小 - 这是存储的数据大小。

现在并非所有用户都会在两天内创建实例(尽管他们可能在任一天都创建了多个实例)。

一个查询,将选择在第1天的最大尺寸,其中用户ID也创造了第2天

我完全失去了作为从哪里开始对这个实例的实例后,我一。

我编写了一些C#代码,用于过滤从更简单的SQL查询返回的结果,但它太慢,无法给我想要的结果。

我是否希望从SQL中得到太多(即我所要求的甚至可能)?如果任何人都可以给我一个这样的查询的例子,并解释大概复合查询的每个步骤在做什么?

谢谢!

回答

1
Select Top 1 Key, Instance, UserId, Day, Size 
From Table1 
Where UserId IN (Select UserId from Table1 where Day = 'Day 2') 
And Day = 'Day 1' 
Order By Size asc 
+0

这个答案乍看起来并不像乍一看那样完美,但仍然让我对复合查询的理解远远超过了我,所以非常感谢! :) – Goz

+0

答案是实际上给你正确的发展方向;) –

+0

我不确定这个将按照你的指定工作。请参阅“Where exists(从Table1中选择UserId,其中Day ='Day 2')”仅检查id是否存在带有Day2的表中的任何记录。因此,它与用户的第1天和第2天的状态无关。 – athabaska

3
SELECT Top 1 t1.* 
FROM table t1 
INNER JOIN table t2 on t1.UserID = t2.UserID AND t2.Day = 2 
WHERE t1.Day = 1 
ORDER BY Size DESC 

至于解释 - 你的表连接到自身,结果将有有两日活动的用户行。结果按大小按降序排列,并且只返回第一行,该行应具有最大大小。

+0

这看起来很完美...我只是要看看它是如何与我的实际数据库(我使用了一个简明的例子) – Goz

+0

谢谢,但我确实遇到了麻烦实施这Nadeem_MK的更容易得到工作,所以我接受他们的答案。 – Goz