根据跨行的条件返回行

时间:2016-09-02 02:11:46

标签: sql sql-server

我不确定这样的查询是否可行。我尝试了几个不同的查询,但没有一个返回所需的输出。这是要求:

我有两张桌子:

Header:

Id(PK)  Name
1       A
2       B
3       C

Detail:

Id(FK)  Name    Min     Max
1       X1      1       3
1       X2      5       5
1       X3      8       9
2       X1      11      11
2       X2      13      13
2       X3      15      18
3       X1      2       2
3       X2      1       6
3       X3      9       11

我需要一个给出以下输入的查询:

@X1 = 2
@X2 = 5
@X3 = 9

应输出:

Id(PK)  Name
1       A
3       C

由于提供的值介于Detail表中的Min和Max之间。

此外,输入0表示没有范围,例如:

@X1=0
@X2=0
@X3=16

应输出:

Id(PK)  Name
2       B

即使@ X1和@ X2为0且不在任何范围之间,0表示“一切都可以接受”。如果@ X3也为0,它会输出所有:标题Id 1,2和3,因为所有记录都在范围内。

我知道我可以使用临时表和存储过程来执行此操作,甚至可以使用Java处理它;但我想知道这是否可以通过直接SQL

非常感谢帮助

2 个答案:

答案 0 :(得分:0)

试试这个:

select distinct d1.ID
from Detail d1
    inner join Detail d2 on d2.ID = d1.ID and @x2 = 0 or @x2 between d2.Min and d2.Max
    inner join Detail d3 on d3.ID = d1.ID and @x3 = 0 or @x3 between d3.Min and d3.Max
where @x1 = 0 or @x1 between d1.Min and d1.Max

您可以将其包装到子查询并加入到它以从Header表中获取其他详细信息。

答案 1 :(得分:0)

您可以尝试以下查询

 SELECT DISTINCT h.Id,h.Name
  FROM Header h
     JOIN Details d
       ON h.id=d.id
   WHERE ((@x1 BETWEEN d.Min and d.Max)
         OR (@x2 BETWEEN d.Min and d.Max)
          OR (@x3 BETWEEN d.Min and d.Max))