Ich habe folgende Daten:

ID    From             To
----------------------------------
1      NULL            NULL
1      NULL            NULL
1      2019-01-01      2019-01-01
2      NULL            NULL
2      NULL            NULL
3      NULL            NULL
3      2019-02-01      2019-02-01

Ich muss die IDs der Datensätze mit NULL-Werten in allen Datensätzen in den Feldern Von und Bis abrufen.

Zum Beispiel sollte ich basierend auf den obigen Daten ID 2 erhalten.

1
Hasan Shouman 6 Feb. 2020 im 16:27

6 Antworten

Beste Antwort

Sie können dies mit dem Operator NOT IN versuchen.

create table TestTable (id int, FromDt Date, ToDt Date)
Insert into TestTable Values
    (1, NULL, NULL), 
    (1, NULL, NULL), 
    (1, '2019-01-01', '2019-01-01'),
    (2, NULL, NULL),
    (2, NULL, NULL),
    (3, NULL, NULL),
    (1, '2019-02-01', '2019-02-01')

Select 
     distinct Id 
From TestTable where FromDt is null and ToDt is null
and id not in (Select t.Id from TestTable t 
         where t.fromDt is not null and t.toDt is not null)

Hier ist die db <> fiddle -Demo.

Es sieht aus wie unten gezeigt.

enter image description here

1
Suraj Kumar 6 Feb. 2020 im 14:27

Sie können die Aggregation verwenden:

select id
from t
group by id
having max(from) is null and max(to) is null;

Beachten Sie, dass from und to SQL-Schlüsselwörter sind, sodass sie für Spaltennamen sehr schlecht sind. Ich bin den Werten nicht entkommen, vorausgesetzt, Sie haben nur die Spaltennamen für Ihre Frage vereinfacht.

3
Gordon Linoff 6 Feb. 2020 im 13:27

Gordons Methode ist weitaus prägnanter und ich würde effizienter wetten, obwohl ich das nicht getestet habe. Eine Alternative zum Auffinden von Listenelementen, die in Verbindung mit einem anderen Element auftreten oder nicht, ist die Verwendung einer WHERE EXISTS -Klausel. Oder im negativen Fall wie diesem eine WHERE NOT EXISTS -Klausel.

select distinct
    id
from 
    mytable as t1
where 
    not exists (select 1
                from mytable as t2
                where [to] is not null
                and t2.id = t1.id)
    and
    not exists (select 1
                from mytable as t2
                where [from] is not null
                and t2.id = t1.id);
1
Eric Brandt 6 Feb. 2020 im 13:52

Ein weiterer Vorschlag, bei dem ausgenommen, alle IDs außer denen, von denen von oder nach, nicht null sind

select id from t
except
select id from t where from is not null or to is not null
0
nfgl 6 Feb. 2020 im 14:00

Bitte beziehen Sie sich auf diese Lösung. Und Sie sollten keine reservierten Schlüsselwörter wie Von und Bis als Spaltennamen verwenden.

select id from sample  group by id having max(From_) is null and max(To_) is null;

Ich habe von und nach von_ und To_ ersetzt.

0
Prajakta Kale 6 Feb. 2020 im 14:15
SELECT 
    D.Id 
FROM 
    dbo.YourDataTable D
WHERE Id IN -- ID must have null in both From and to fields
(
    SELECT 
        D.Id 
    FROM 
        dbo.YourDataTable D 
    WHERE 
       D.[From] IS NULL AND D.[To] IS NULL
    GROUP BY 
        D.Id 
) 
AND Id NOT IN -- Except if the id has From or To in any of its rows
(
    SELECT 
        D.Id 
    FROM 
        dbo.YourDataTable D 
    WHERE 
       D.[From] IS NOT NULL OR D.[To] IS NOT NULL
    GROUP BY 
        D.Id 
) 
GROUP BY Id

Sie können Ihrer Tabelle eine berechnete Spalte mit dem Namen "noData" oder ähnlichem hinzufügen:

ALTER TABLE dbo.YourDataTable ADD hasData AS (IIF([From] IS NULL AND [To] IS NULL,0,1))

Fügen Sie einen Index hinzu und verwenden Sie stattdessen die WHERE D.noData = 1-Klausel, wenn Sie viele Zeilen für eine bessere Leistung haben.

0
starbyone 6 Feb. 2020 im 14:21