2016-08-23 5 views
1

Ich verwende Microsoft SQL Server 2012. Ich muss überprüfen, ob Tabelle SiteObjects in Datenbank mit dem Namen mindestens einen Datensatz hat, wo Spalte mit dem Namen SiteRegionId ‚s-Wert 22 gleich ist.Wie überprüft man, ob SQL-Spalte Wert hat?

Wenn es hat eine gewisse Logik imlpement, wenn es nicht eine andere Logik zu implementieren.

Hier meine Implementierung:

IF EXISTS (SELECT * FROM SiteObjects WHERE SiteRegionId = 22) 
BEGIN 
    ----do what you need if exists 
    RETURN '0'; --not deleted 
END 
ELSE 
BEGIN 
    --do what needs to be done if not 
    DELETE FROM SiteRegions 
    WHERE Id = 22; 

    RETURN '1'; 
END 

Ich denke, dass diese Zeile:

SELECT * FROM SiteObjects WHERE SiteRegionId = 22 

nicht wirksam ist, weil, wie ich es läuft auf allen Tabellenzeilen verstehen und wählt alle Zeilen, in denen SiteRegionId gleich 22. Gibt es eine Möglichkeit, es effektiver zu machen? Und zu überprüfen, ob jeder der Reihe Bedingungen erfüllt, wenn es geht.

Antwort

3

Nein, EXISTS ist intelligent genug, um wahr so ​​schnell zurückzukehren, wie es eine einzelne Zeile beobachtet hat. Und das System weiß, dass keine Spaltendaten tatsächlich abgerufen werden.

In den 90er Jahren waren einige Optimierer und Datenbanksysteme nicht intelligent genug, um diese Situation zu erkennen, aber ich bin mir nicht bewusst, dass in diesen Tagen tatsächlich alle Daten abgerufen würden. (Sicher, für die SQL Server-Zeile, wurde es vor der 2000-Version des Produkts behoben)

So sind die Vorschläge in den anderen Antworten Ratschläge aus über einem Jahrzehnt zurückgelassen.

Siehe Subqueries with Exists:

Die Unterabfrage erzeugt keine tatsächlich keine Daten

...

  • Die Auswahlliste einer von EXISTS eingeführten Unterabfrage besteht fast immer aus einem Sternchen (*). Es gibt keinen Grund, Spaltennamen aufzulisten, weil Sie nur testen, ob Zeilen vorhanden sind, die die in der Unterabfrage angegebenen Bedingungen erfüllen.
  • +0

    So gibt es keinen Unterschied zwischen diesen beiden: 'IF EXISTS (SELECT 1 FROM SiteObjects WHERE SiteRegionId = 22)' 'IF EXISTS (SELECT * FROM SiteObjects WHERE SiteRegionId = 22)' ??? – Michael

    +0

    @Michael - wenn Sie Pläne vergleichen, sollten Sie feststellen, dass sie identisch sind. –

    1

    Ich würde vorschlagen, Sie schreiben an:

    IF EXISTS (SELECT 1 FROM SiteObjects WHERE SiteRegionId = 22) 
    

    Sie brauchen nicht * dh zu verwenden, holen alle Spalten der Tabelle die Existenz eines Datensatzes zu überprüfen. Sie können dies einfach mit einem 1 tun.

    In Bezug auf die Effizienz werden jedoch sowohl die Abfragen, dh die mit * als auch die mit 1 fast denselben Ausführungsplan haben, wenn sie ausgeführt werden. Normalerweise ist 1 bevorzugt, um es lesbar mehr zu machen. Sie können diesem Link folgen, um zu sehen, wie die beiden Abfragen den gleichen Ausführungsplan ergeben. SQL SERVER – SELECT 1 vs SELECT * – An Interesting Observation

    +0

    Ich sehe nicht, wie '1 'gegen' * 'über die Lesbarkeit streiten kann. Wenn ich 'SELECT 1' oder' SELECT TOP1' sehe, ist mein direkter Gedanke: "Diese Person hat ihr SQL in den 90er Jahren gelernt und ihr Wissen seither nicht aktualisiert (dh es war ein Workaround für ein Problem, für das es noch keinen gab eine lange Zeit) " –

    1

    Wenn Sie nur alle Zeilen sind, wenn es müssen wissen, wo die SiteRegionId = 22, dann Ihre Abfrage ersetzen ID mit einer indizierten Spalte (Ihre primäre Schlüsselspalte) zu SELECT TOP 1 id FROM SiteObjects WHERE SiteRegionId = 22

    ändern, und dies wird Ihnen sagen, wenn es irgendwelche Zeilen gibt, aber indem Sie nur eine Spalte aus einer Zeile zurückbringen.

    Der TOP 1 Teil stoppt die Abfrage nach dem 1. Zeile gefunden wurde, so dass er sich nicht über die gesamte Tabelle zu suchen braucht.

    +2

    *' EXISTS' * stoppt die Abfrage, nachdem eine Zeile gefunden wurde. Es braucht keine Hilfe von einem "TOP". –

    +0

    Danke Damien, gut zu wissen. – RussAwesome

    Verwandte Themen