查找表中缺少的数字

时间:2017-01-13 14:57:56

标签: sql sql-server

我想生成一个查询,该查询将生成SQL表中缺少的索引值列表。到目前为止,我所拥有的是

SELECT index - 1
FROM table
WHERE index - 1 NOT IN (
    SELECT DISTINCT index
    FROM table)
    AND
    index != 1;

这只能找到缺失索引序列的第一个缺失索引。我想生成一个查询,该查询输出1和MAX(index)之间的每个数字,这些数字在表格中不显示为index。有没有办法做到这一点?

2 个答案:

答案 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;表格开头和结尾的值。您的问题未指明这是一个问题。