2011-12-01 132 views
1

是否可以为以下方案编写单个查询?是否可以为以下情况编写单个查询?

方案 -

表 -

column name  -   id   date    isPaid 
values   -   1  1/1/2011    1 
          2  1/2/2011    1 
          3  1/3/2011    0 
          4  1/4/2011    0 
          5  1/5/2011    0 

我希望有一个结果集,它包含(所有ispaid = 1)和(只有1行ispaid = 0其日期较小的)。

结果集:

column name   -  id   date    isPaid 
values    -  1  1/1/2011    1 
          2  1/2/2011    1 
          3  1/3/2011    0 

感谢

+0

欢迎StackOverflow上:如果您发布的代码,XML或数据样本,** **请在高亮文本编辑器的线,然后单击“代码示例“编辑器工具栏上的按钮(”{}“),以精确地格式化和语法突出显示它! –

回答

2

您可以使用UNIONdocs

SELECT 
    [id], 
    [date], 
    [isPaid] 
FROM 
    [tablename] 
WHERE 
    [ispaid] = 1 

UNION ALL 

SELECT TOP 1 
    [id], 
    [date], 
    [isPaid] 
FROM 
    [tablename] 
WHERE 
    [ispaid] = 0 
ORDER BY 
    [date] ASC 
+0

@ypercube,为什么要添加'ALL'?可以不重复..(*我现在已经恢复到我原来的答案,但如果你可以给我一些参数,我们可以把它放回*) –

+0

我搜索,似乎'联盟所有'是比'UNION' ..非常感谢@ypercube的改进 –

+1

如果优化器能够发现没有重复,那就不需要了。但它并没有受到伤害,这就像强制优化器在'UNION'期间不进行任何排序(和比较)。 –

0

假设日期将被提供给用户的查询,其数据被检索

select t.* 
from table t, 
(select Top 1 id, date, ispaid 
from table 
where ispaid = 0 and date<?) np 
where (t.ispaid=1 and t.date = ?) OR (t.id = np.id) 
1

这应该做你需要什么在SQL Server 2005和更高版本中。

select 
    [id], 
    [date], 
    isPaid 
from ( 
    select 
     [id], 
     [date], 
     isPaid, 
     ROW_NUMBER() over (partition by ispaid order by date) as row 
    from table_name t) a 
where ispaid = 1 
    or row = 1 
order by [date] 
+1

或简单地说:'ispaid = 1或row = 1'。 –

+0

谢谢Andriy,我改变了代码。 –

相关问题