在过去的几天里,我一直在尝试解决一个问题,我可以用一个简单的例子很好地解释它:
我有一个如下表格:
> Row number ID Value1 Value2
1 1 4 10 ---
2 1 2 9 ---
3 1 3 8
4 1 2 7
5 1 2 6
6 1 1 5 ---
7 1 1 4
8 1 1 3
9 2 8 21
.
.
.
每个ID的值1(v1)和value2(v2)的行数都不相关。
我需要选择没有满足value1.other_row <= value1.selected_row 和条件的其他行的行 value2.other_row> value2.selected_row。必须通过一组类似的ID进行验证。
例如,不应该接受第5行,因为查看第4行(r4),尽管v1(r4)= v1(r5),但可以验证v2(r4)> v2(r5)。
另一方面,应该看到第6行,因为组ID = 1中没有其他行具有小于或等于其自身的v1,而具有更大的v2!
按照此逻辑,仅应接受前面带有-的行。
我尝试了自我JOIN,并使用ON子句定义了条件,但无法理解如何为每隔一行测试组中的每一行。
有人可以帮助我实现这一目标吗? 非常感谢。
答案 0 :(得分:1)
<!DOCTYPE html>
<html>
<head runat="server">
<title>Choose language to upload .html files</title>
</head>
<body>
<form">
<div>
<h1>Choose language to upload .html files</h1>
<select>
/*After page is loaded, method from a controller will add options*/
</select>
</div>
<button>Start</button> /*Another method from a controller will be bound to this button*/
</form>
</body>
</html>
子句在这里似乎很好地工作:
NOT EXISTS
答案 1 :(得分:0)
这是自连接的替代解决方案:
CREATE TABLE #temp (RN INT, ID INT, Value1 INT, Value2 INT)
INSERT INTO #temp
SELECT 1, 1 , 4, 10 UNION ALL -- match
SELECT 2, 1, 2, 9 UNION ALL -- match
SELECT 3, 1, 3, 8 UNION ALL
SELECT 4, 1, 2, 7 UNION ALL
SELECT 5, 1, 2, 6 UNION ALL
SELECT 6, 1, 1, 5 UNION ALL -- match
SELECT 7, 1, 1, 4 UNION ALL
SELECT 8, 1, 1, 3 UNION ALL
SELECT 9, 2, 8, 21
SELECT * FROM #temp WHERE RN NOT IN (
SELECT t1.RN
FROM #temp t1
INNER JOIN #temp t2 on t1.ID=t2.ID and t1.value1 >= t2.value1 AND t1.value2 < t2.value2
)
输出: