2016-08-23 66 views
0

考虑以下数据SQL可以根据范围限制交错数据吗?

表1

Key Value 
--- ----- 
A 1 
B 2 
C 3 
D 4 
E 5 
F 6 
G 7 
H 8 
I 9 
J 10 

表2

Q MaxValue 
- -------- 
X 3 
Y 6 
Z 10 

我试图创建一个连接符合表1与表2的值时,的表1小于或等于表2中的MaxValue,但只有在它们大于先前的MaxValue时才如此,如

结果

Key Value Q MaxValue 
--- ----- - -------- 
A 1  X 3 
B 2  X 3 
C 3  X 3 
D 4  Y 6 
E 5  Y 6 
F 6  Y 6 
G 7  Z 10 
H 8  Z 10 
I 9  Z 10 
J 10  Z 10 

这里你可以看到,虽然AF全部满足小于或等于6(Y的MaxValue的)的标准,我希望AC进行匹配才X,因为他们已经匹配X的标准小于3,X是“事先最大值”。

那么这可以在SQL中实现吗?

+0

您可能需要使用动态SQL来处理这个问题。 –

+0

@TimBiegeleisen,不,它不。在动态SQL中更容易,但合适的嵌套选择将会执行。 –

回答

1

这是不是很漂亮,但它应该为你工作:

select Z.[Key], Z.Value, T2.Q, Z.MaxValue from 
(
    select Y.[Key], Y.Value, Min(MaxValue) as MaxValue from 
    (
     select T1.*, T2.MaxValue from Table1 T1 cross join Table2 T2 
    ) Y 
    where Y.Value <= Y.MaxValue 
    group by Y.[Key], Y.Value  
) Z 
inner join Table2 T2 on Z.MaxValue = T2.MaxValue 
  • select T1.Value, T2.MaxValue from Table1 T1 cross join Table2 T2得到的价值和MaxValue的所有可能的组合。
  • 然后我根据ValueKey分组,并包括条件where Y.Value <= Y.MaxValue排除那里有相同Value重叠MaxValue小号组合。
  • 最后,我从Table2获得原始Q列。
0

希望帮助

select [Key], 
     [Value], 
     (SELECT [Q] FROM [TB2] T2 WHERE [MaxValue] IN (SELECT MIN(MaxValue) FROM [Table1] T2 WHERE T1.[Value]<= T2.[MaxValue])) AS Q, 
     (SELECT MIN(MaxValue) FROM [TB2] T2 WHERE T1.[Value]<= T2.[MaxValue]) AS MaxValue 
FROM [Table2] T1