如何查询集合和子集以及获取不包含其他集合的集合

时间:2013-09-13 19:33:03

标签: sql set

我认为我有一个简单的问题,但由于我缺乏数据库建模和SQL的经验,我无法得到正确的解决方案, 我可以绘制基本概念,但我很难实现解决方案

假设我有一些套装A,B和C.

A在B里面

B在C里面

A是B set

中具有最大值的10个对象的集合

B是所有大于100的值的集合

C是所有大于50的值的集合

enter image description here

这很容易,

现在我需要获得50个具有C中最大值的对象,这些对象不在A中 我如何将该问题转换为SQL语言,或者我应该使用哪些命令,工具或设计模式来解决这个问题?

我不确定我是否足够清楚, 再次抱歉,如果问题对某些人来说太微不足道了,但我正在努力学习更多有关SQL和设计的知识。

我正在寻找一种不受框架或操作系统约束的通用解决方案

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

我假设您有一个t列,value列,标签“A”,“B”和“C”都基于这些。

select t.*
from t left outer join
     (select value
      from t
      where value >= 100
      order by value desc
      limit 1
     ) A
     on t.value = A.value
where t.value >= 50 and A.value is null
order by value desc
limit 50;

limit的使用是特定于数据库的。 top子句中可能是rownumwhere或其他内容,具体取决于数据库。

编辑:

如果集合足够大,你可以这样做:

select t.*
from t
where value >= 50 and value < 100
order by value desc
limit 50;

答案 1 :(得分:0)

可能这个查询会有所帮助:

select Col1,Max(Col2) from
(select col1, col2 from TableC
Except
Select col1, col2 from TableA)as A
Group By Col1

这里内部查询只会选择表A中但不在表C中的记录,然后外部查询将占用这些记录的最大值。

答案 2 :(得分:0)

您好,我不确定我是否正确理解您的问题。如果我将A,B和C视为你的SQL表并假设它们之间存在某种关系,那么你可以编写类似

的查询

SELECT C. * FROM C WHERE C.ID NOT IN

(选择B.ID来自B加入A B.ID = A.ID)

子查询(第二行)为您提供B和A之间共同的所有对象(基本上是A)。

我再次不确定这是否是您正在寻找的,如果您可以在这里分享您的真实生活场景将会有所帮助。

有关集合论和SQL理解,请参阅下面的文章

http://seanmehan.globat.com/blog/2011/12/20/set-theory-and-sql-concepts/