2009-07-13 8 views
0

Ich habe diese Arbeit SQL-Anweisung:UNNEST einer SQL-Anweisung

select oriseqs.newID from oriseqs WHERE oriseqs.singlets=1 AND 
oriseqs.newID not in (select newID from cleanreport WHERE trash!="") 

Meine Frage ist, wie man in einem anderen in diesem speziellen Fall wählen zu tun zu vermeiden. Ich meine, die select-Anweisung so zu schreiben, dass es keine verschachtelte Auswahl gibt.

Hier ist das relevante Schema, wenn nötig:

CREATE TABLE cleanreport(newID TEXT, perc TEXT, inicoord INTEGER, endcoord INTEGER, ilen INTEGER, trash TEXT, comments TEXT); 
CREATE TABLE oriseqs(newID TEXT, oldID TEXT, rawseq TEXT, singlets BOOLEAN); 
+0

Sie haben mindestens die Hälfte des Schemas weggelassen: Welche Indizes haben Sie an den beiden Tabellen? –

Antwort

1

Es gibt mehr Möglichkeiten, fast jedes Problem in SQL zu nähern. In Ihrem speziellen Problem ist die erste Alternative, die Ihnen in den Sinn kommt, die Verwendung eines linken äußeren Joins und das Testen auf Null in einer verbundenen Spalte in der zweiten Tabelle. Die Abfrage, die Sie haben, ist jedoch völlig in Ordnung. Ich sehe keinen Grund, dies zu ändern und bezweifle - zumindest bei der ersten Inspektion -, dass Sie eine bessere Leistung von einer Alternative sehen.

+0

Das Gute daran, es mit einer verschachtelten Abfrage zu verlassen, imho als QA-Ingenieur, ist, dass es einfacher ist, die Abfrage später zurückzuentwickeln. – djangofan

+0

Das ist ein weiterer guter Punkt. Der Zweck der linken äußeren Verbindungslösung ist nicht annähernd so offensichtlich. –

0
select o.newID 
from   oriseqs  o 
left outer join cleanreport c on c.newID = o.newID 
WHERE o.singlets=1 
AND c.newID is null; 
3
SELECT oriseqs.newID 
FROM oriseqs AS o 
LEFT JOIN cleanreport AS cr ON o.newID = cr.newID 
WHERE oriseqs.singlets=1 
AND trash != "" 
AND cr.newID IS NULL 

Was sind die PKs?

+0

Sorry, aber was ist "PKs"? – BlogueroConnor

+0

Primärschlüssel für die zwei Tabellen. Normalerweise möchte ich den Primärschlüssel auf Nichtigkeit prüfen – dkretz

+0

Sie sollten 'AND trash! = ""' In die ON-Klausel verschieben. Dies wird ändern (verringern) welche Zeilen erfolgreich verbunden sind, die wiederum ändern werden, die durch 'AND cr.newID IS NULL' gefiltert werden. –

Verwandte Themen