2016-09-10 37 views
1

[免责声明:我很难表达我的问题;所有帮助欢迎]如何执行依赖于其他行的SQL查询?

在我对SQL的理解中,关系主要集中在检索行。我经常遇到以下问题:

如何有效地获得所有的情况,其中val2=Z后跟一行val2=V?换句话说:我该如何表达的查询,可以看一个头到以下行,看看是否有我感兴趣的行的序列

id  val1 val2 
0  A  Z 
1  B  V 
2  C  Z 
3  D  B 

##基于更新

。 (有帮助)的答案,我应该清楚一件额外的事情:我可以看到的顺序是灵活的(它也可以是Z B),其长度也可以不同。

+0

在这种情况下,我想一个条件索引可以工作:'select * from tblname as a where val2 ='z'and(选择val2 from tblname as b where b.id> a.id order by b.id limit 1)='v' - 这应该首先检查val2 ='z''的索引,然后根据子查询有条件地缩小索引。虽然我个人会在PHP中执行这种逻辑...... –

+3

注意:在SQL中,行没有固有顺序。所以没有“下一行”,除非你定义一个命令来确定下一行是什么。 – RBarryYoung

+1

@RBarryYoung。 。 。假设'id'列为这个问题提供了这个信息是合理的。 –

回答

2

ANSI标准具有lead()lag()函数。如果你想在你的结果集两行,然后执行:

select t.* 
from (select t.*, 
      lag(val2) over (order by id) as prev_val2, 
      lead(val2) over (order by id) as next_val2 
     from t 
    ) t 
where (val2 = 'Z' and next_val2 = 'V') or 
     (prev_val2 = 'Z' and next_val2 = 'Z'); 

注:我解释“后面一排”作为基于id下一行之中。处理像ZVV,ZZV等数据时,任何其他解释都会变得模糊不清。

+0

这很酷(对我来说是新的)!答案中有一点让我思考:“如果你想要结果集中的两行”。事实上,我意识到我只会得到符合这种模式的所有行。但他们不会按照它们匹配的方式将这些行组合在一起......也许这样做“获得一系列的行”并不是最好的。是否有另一种模式可以更好地适应这种类型的检索? – Private

+0

@Private。 。 。正如措辞,我没有发现问题的具体情况足以建议一个不同于你的模式。也许你可以用样本数据再问一个问题,以及你想要回答的问题和结果集的例子。 –

+0

谢谢。当行数大于2时,您的解决方案是否也会延长(例如:'ZVZ')? – Private

-2

我不认为你只能用SQL来做到这一点。

我的解决方案是使用任何能够连接到SQL数据库(PHP,C,...)的语言从数据库获取值,然后使用该语言进行任何测试。