2017-07-10 3 views
0

Ich verwende PHP, um auf eine SQL Server-Datenbank zuzugreifen, und ich habe 2 Zahlen als PHP-Variablen gespeichert.Suchen Sie fehlende Zeilen zwischen 2 Variablen in SQL Server

Zum Beispiel ist eine Variable 10 und die andere Variable ist 15.

Ich brauche eine Liste der ‚fehlenden‘ Dokumente d.h Zeilen ausgegeben, wo eine bestimmte Spalte col1 keine Zahlen enthält zwischen 10 und 15.

Beispiel:

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

Variablen:

$start = 10 
$end = 15 

Wunschergebnis mit SQL nur:

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

Warum Sie Tag 'hat PHP', da Sie eine Lösung wollen nur' SQL' mit –

Antwort

0

Wenn Sie keine Zahlen/tally Tabelle haben, können Sie eine Ad-hoc-Tally-Tabelle in Verbindung mit einer LEFT JOIN

Beispiel

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 

Returns

Result 
11 
13 
15 
0

Sie dies auf unterschiedliche Weise umsetzen kann, ein Ansatz ist, eine tally Tabelle zu erzeugen und sie, wie unten links anschließen:

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

Ja nur bemerkt, wenn 10 nicht da ist, wird es sein, verpasst ... Danke –

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

würde ich eine dbo.Numbers(Numbers PK) table (reference #2) verwenden und folgende Abfrage:

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 
)