SQL中的通用和存在量化

时间:2014-09-10 16:14:12

标签: sql

给出关系

X | Y
-------
a | i
a | ii
b | ii
b | ii

如何查询

  1. 长度为X的所有Y的集合(应该产生{ a, b }
  2. 所有X所有Y长度为2的所有{ b }的集合(应该产生{{1}})

1 个答案:

答案 0 :(得分:4)

第一个相当简单(注意,在所有示例中,LENGTH_FUNCTION代表您正在使用的任何SQL数据库中特定于产品的字符串长度函数):

 SELECT DISTINCT X FROM RelationName WHERE LENGTH_FUNCTION(Y) = 2;

对于第二种方法,有多种方法可以解决这个问题。

 SELECT X FROM RelationName GROUP BY X 
    HAVING MIN(LENGTH_FUNCTION(Y)) = 2 AND MAX(LENGTH_FUNCTION(Y)) = 2

将聚合所有X值并过滤那些长度仅为2的

 SELECT DISTINCT X FROM RelationName WHERE LENGTH_FUNCTION(Y) = 2
    AND X NOT IN (SELECT DISTINCT X FROM RelationName WHERE LENGTH_FUNCTION(Y) <> 2)

使用与第一个查询相同的过滤器,但另外过滤掉表中其他位置的任何X值,其值为非长度为2的Y值。最后

 SELECT DISTINCT X FROM RelationName RN1 WHERE LENGTH_FUNCTION(Y) = 2
    AND NOT EXISTS (SELECT * FROM RelationName WHERE X = RN1.X AND LENGTH_FUNCTION(Y) <> 2)

以一种你可能会发现更具表现力的方式进行相同的过滤(但可能性能较差)