it-swarm.com.de

Der schnellste Weg, um festzustellen, ob ein Datensatz vorhanden ist

Wie der Titel schon sagt ... Ich versuche, den schnellsten Weg mit dem geringsten Aufwand herauszufinden, um festzustellen, ob ein Datensatz in einer Tabelle vorhanden ist oder nicht. 

Beispielanfrage:

SELECT COUNT(*) FROM products WHERE products.id = ?;

    vs

SELECT COUNT(products.id) FROM products WHERE products.id = ?;

    vs

SELECT products.id FROM products WHERE products.id = ?;

Angenommen, der ? wird mit 'TB100'... ausgetauscht. Sowohl die erste als auch die zweite Abfrage geben genau das gleiche Ergebnis zurück (beispielsweise ... 1 für diese Konversation). Die letzte Abfrage gibt 'TB100' wie erwartet zurück oder nichts, wenn id nicht in der Tabelle vorhanden ist. 

Der Zweck besteht darin, herauszufinden, ob sich id in der Tabelle befindet oder nicht. Wenn dies nicht der Fall ist, fügt das Programm den Datensatz als nächstes ein. Wenn dies der Fall ist, überspringt das Programm oder führt eine UPDATE-Abfrage basierend auf einer anderen Programmlogik außerhalb des Bereichs dieser Frage aus.

Welches ist schneller und hat weniger Aufwand? (Dies wird zehntausende Male pro Programmlauf wiederholt und mehrmals täglich ausgeführt). 

(Ausführen dieser Abfrage gegen M $ SQL Server von Java über den von M $ bereitgestellten JDBC-Treiber.)

111
SnakeDoc

SELECT TOP 1 products.id FROM products WHERE products.id = ?; übertrifft alle Ihre Vorschläge, da die Ausführung beendet wird, nachdem der erste Datensatz gefunden wurde.

140
Declan_K

EXISTS (oder NOT EXISTS) wurde speziell für die Überprüfung entwickelt, ob etwas vorhanden ist und daher die beste Option sein sollte (und ist). Es wird in der ersten Zeile angehalten, die übereinstimmt, sodass keine TOP-Klausel erforderlich ist und tatsächlich keine Daten ausgewählt werden, sodass die Größe der Spalten nicht überschreitet. Sie können SELECT * hier sicher verwenden - nicht anders als SELECT 1, SELECT NULL oder SELECT AnyColumn... (Sie können sogar einen ungültigen Ausdruck wie SELECT 1/0 verwenden und er wird nicht beschädigt)

IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END
153
Nenad Zivkovic

Nichts kann schlagen 

SELECT TOP 1 1 FROM products WHERE id = 'some value';

Sie müssen nicht zählen, um zu wissen, ob in der Tabelle Daten vorhanden sind. Verwenden Sie keinen Alias, wenn dies nicht erforderlich ist. 

17
AgentSQL
SELECT CASE WHEN EXISTS (SELECT TOP 1 *
                         FROM dbo.[YourTable] 
                         WHERE [YourColumn] = [YourValue]) 
            THEN CAST (1 AS BIT) 
            ELSE CAST (0 AS BIT) END

Dieser Ansatz liefert einen Booleschen Wert für Sie zurück.

10
Kris Coleman

Sie können auch verwenden

 If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
    BEGIN
         --<Do something>
    END 

ELSE    
     BEGIN
       --<Do something>
     END
7
atik sarker

Ich glaube nicht, dass jemand es schon erwähnt hat, aber wenn Sie sicher sind, dass sich die Daten nicht unter Ihnen ändern, sollten Sie auch den NoLock-Hinweis anwenden, um sicherzustellen, dass sie beim Lesen nicht blockiert werden.

SELECT CASE WHEN EXISTS (SELECT 1 
                     FROM dbo.[YourTable] WITH (NOLOCK)
                     WHERE [YourColumn] = [YourValue]) 
        THEN CAST (1 AS BIT) 
        ELSE CAST (0 AS BIT) END
4
Stefan Zvonar

Nachfolgend finden Sie die einfachste und schnellste Methode, um zu ermitteln, ob ein Datensatz in der Datenbank vorhanden ist oder nicht. __

SELECT distinct 1 products.id FROM products WHERE products.id = ?;
2
manish Prasad
SELECT COUNT(*) FROM products WHERE products.id = ?;

Dies ist die crossrelational Datenbanklösung, die in allen Datenbanken funktioniert. 

2
Muhammad Aslam

Ich habe dies in der Vergangenheit verwendet und es ist kein vollständiger Tabellenscan erforderlich, um festzustellen, ob etwas vorhanden ist. Es ist super schnell ...

UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
     --Do work
END             
0
Eric Parsons

Für diejenigen, die aus MySQL- oder Oracle-Hintergrund darauf stolpern, unterstützt MySQL die LIMIT-Klausel zur Auswahl einer begrenzten Anzahl von Datensätzen, während Oracle ROWNUM verwendet.

0
Werner
create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
   when no_data_found then
        dbms_output.put_line(i||' does not exists');

end;
0
kiran