我想生成一个查询,该查询将生成SQL表中缺少的索引值列表。到目前为止,我所拥有的是
SELECT index - 1
FROM table
WHERE index - 1 NOT IN (
SELECT DISTINCT index
FROM table)
AND
index != 1;
这只能找到缺失索引序列的第一个缺失索引。我想生成一个查询,该查询输出1和MAX(index)
之间的每个数字,这些数字在表格中不显示为index
。有没有办法做到这一点?
答案 0 :(得分:4)
您需要一个数字表来查找缺失的索引值
import { Component } from "@angular/core";
import { AbstractControl, FormBuilder, FormGroup, Validators, FormArray } from "@angular/forms";
import { Toolbar } from "myServices";
import { ToolbarItem } from "myClasses";
// services
@Component({
selector: "my-component",
templateUrl: `
<form [formGroup]="frm" (ngSubmit)="onSubmit(frm)">
<label>Serial</label>
<input type="text" formControlName="SerialNumber" [value]="SerialNumber?.value" />
<button id="form-submit" type="submit">Submit</button>
</form>
`
})
export class MyComponent {
constructor(
private readonly fb: FormBuilder,
private toolbar: Toolbar //this just adds a button to a toolbar
) { }
onSubmit({ value, valid }: { value: any, valid: boolean }) {
console.log(value, valid);
}
ngOnInit() {
this.toolbarService.addAction(new ToolbarItem('save', function () {
// function called when this button is clicked
// how do I submit the form here?
console.log(this.frm); //this has no values, 'this' is a different scope
}));
this.frm = this.fb.group({
SerialNumber: ['abc123']
});
}
}
方法
Recursive CTE
使用计数表生成数字的另一种方法。
DECLARE @max_num INT = (SELECT Max(index)
FROM table);
WITH cte
AS (SELECT 1 AS num
UNION ALL
SELECT num + 1
FROM cte
WHERE num < @max_num)
SELECT *
FROM cte c
WHERE NOT EXISTS (SELECT 1
FROM table t
WHERE c.num = t.index)
ORDER BY c.num
OPTION (maxrecursion 0)
目前,如果您的最大值超过10000,则会生成10000个连续的行号,然后您添加另一个交叉连接以增加数字
答案 1 :(得分:0)
我对此类查询的偏好是显示范围。一种简单的方法是使用lead()
:
select (index + 1) as first_missing, (next_index - 1) as last_missing,
(next_index - index - 1) as num_missing
from (select t.*, lead(index) over (order by index) as next_index
from t
) t
where next_index <> index + 1;
这显示了每个&#34;内部&#34;缺少范围。因为它不使用数字表,所以无论表的大小或缺失值的数量如何,它都能有效地工作。
它不显示&#34;缺少&#34;表格开头和结尾的值。您的问题未指明这是一个问题。