2017-07-10 79 views
0

我正在使用PHP访问SQL Server数据库,并将2个数字存储为PHP变量。在SQL Server中查找2个变量之间的缺失行

例如,一个变量是10,另一个变量是15

我需要输出'缺失'文档列表,例如某列col1不包含1015之间的数字的行。

例子:

col1 
---- 
2 
4 
6 
8 
10 
12 
14 
16 
18 
20 

变量:

$start = 10 
$end = 15 

期望的结果只使用SQL:

result 
------ 
11 
13 
15 
+0

你为什么标签'PHP'既然你想只使用'SQL' –

回答

0

如果你没有一个数字/理货表,你可以使用一个与LEFT JOIN

Declare @R1 int = 10 
Declare @R2 int = 15 

Select Result= N 
From (
     Select Top (@[email protected]+1) 
       [email protected]+Row_Number() Over (Order By (Select null)) 
     From master..spt_values n1,master..spt_values n2 
     ) A 
Left Join YourTable B on A.N = B.[col1] 
Where B.[col1] is null 

返回

Result 
11 
13 
15 
0

您可以用不同的方式实现这一点,一种方法是产生一个符合表,也离开了如下加入:

Declare @start int = 10 
Declare @end int = 15 

;With CTE_Numbers as (
    Select top (@end - @start+1) RowN = @start + Row_number() over (order by (SELECT NULL)) -1 
     from master..spt_values s1, master..spt_values s2 
     ) 
     Select c.RowN as Result from CTE_Numbers c 
      left join yourtable t 
      on c.RowN = t.col1 
      where t.col1 is null 
+0

是刚刚发现一个解决办法,如果10是不是有这将是错过了...谢谢 –

0
declare @t table (col1 int); 
    insert into @t values 
    (2), 
    (4), 
    (6), 
    (8), 
    (10), 
    (12), 
    (14), 
    (16), 
    (18), 
    (20) 

    declare @start int = 10, 
      @end int = 15; 

    with nums as 
    (
    select n 
    from 
     (
     select row_number() over(order by getdate()) n 
     from sys.all_columns c1 cross join sys.all_columns c2 
     ) t 
    where n between @start and @end 
    ) 

    select * 
    from nums 
    where not exists (select col1 from @t t where nums.n = t.col1); 
0

我会用一个dbo.Numbers(Numbers PK) tablereference #2)和下面的查询:

DECLARE @start INT = 10, @end INT = 15 

SELECT x.Col1 
FROM dbo.SourceTable x 
WHERE x.Col1 >= @start AND x.Col1 <= @end 
AND NOT EXISTS (
    SELECT * FROM dbo.Numbers n 
    WHERE n.Number >= @start AND n.Number <= @end 
    AND n.Number = x.Col1 
)