我不确定这样的查询是否可行。我尝试了几个不同的查询,但没有一个返回所需的输出。这是要求:
我有两张桌子:
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
非常感谢帮助
答案 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))