2012-04-03 3 views
3

Mit sqlite3, habe ich eine Tabelle, die wie folgt aussieht:Wie überspringe ich ein übereinstimmendes Ergebnis einer Unterabfrage?

+---------+-----------------+----------+-----------+--------+ 
| ArtId | Location  | ArtistID | Title | Size | 
+---------+-----------------+----------+-----------+--------+ 
| 3  |  China  | 400 | birds | small | 
| 4  |  Samoa  | 670 | stars | large | 
| 5  |  Chile  | 427 | clouds | medium | 
| 6  |  US  | 427 | clouds | small | 
| 7  |  France  | 123 | collage | small | 
| 8  |  Spain  | 123 | collage | large | 
| 9  |  Belarus  | 123 | collage | medium | 
+---------+-----------------+----------+-----------+--------+ 

Ich habe eine Abfrage, wo die einzigen Ergebnisse sind diejenigen mit doppelten Titel und Künstler alle Ergebnisse produziert:

SELECT * 
FROM LiveArt c1, (SELECT Title, ArtistID FROM LiveArt GROUP BY Title, ArtistID) c2 
WHERE c1.Title = c2.Title AND c1.ArtistID = c2.ArtistID 

zu produzieren die folgende Tabelle:

+---------+-----------------+----------+-----------+--------+ 
| ArtId | Location  | ArtistID | Title | Size | 
+---------+-----------------+----------+-----------+--------+ 
| 5  |  Chile  | 427 | clouds | medium | 
| 6  |  US  | 427 | clouds | small | 
| 7  |  France  | 123 | collage | small | 
| 8  |  Spain  | 123 | collage | large | 
| 9  |  Belarus  | 123 | collage | medium | 
+---------+-----------------+----------+-----------+--------+ 

Was ich zurück will, ist dies:

+---------+-----------------+----------+-----------+--------+ 
| ArtId | Location  | ArtistID | Title | Size | 
+---------+-----------------+----------+-----------+--------+ 
| 6  |  US  | 427 | clouds | small | 
| 8  |  Spain  | 123 | collage | large | 
| 9  |  Belarus  | 123 | collage | medium | 
+---------+-----------------+----------+-----------+--------+ 

Wie kann ich meine Abfrage optimieren (das erste übereinstimmende Ergebnis überspringen)?

+0

definieren SQL funktioniert in Form von Mengen und es gibt keine Vorstellung von der Reihenfolge in einer Menge. Möchten Sie das übereinstimmende Ergebnis mit dem niedrigsten ArtId-Wert überspringen? –

+2

Und warum wird die 'ArtId = 9' nicht übersprungen? –

+0

@AdamMihalcin, das verstehe ich. Ich möchte im Grunde eines der Duplikate ausgelassen/übersprungen. Ich interessiere mich nicht wirklich für das, also dachte ich, dass es Sinn macht, das erste Duplikat zu überspringen und den Rest auszuwählen. –

Antwort

1
select * from tabName A 
where A.ArtId != 
(
    select min(ArtId) 
    from tabName B 
    group by Title 
    having A.Title=B.Title 
); 

ArtId  Location ArtistID Title  Size 
---------- ---------- ---------- ---------- ---------- 
6   US   427   clouds  small 
8   Spain  123   collage  large 
9   Belarus  123   collage  medium 
0
SELECT c1.* 
FROM LiveArt c1 
WHERE EXISTS 
     (SELECT * 
     FROM LiveArt c2 
     WHERE c1.ArtID < c2.ArtID 
      AND c1.Title = c2.Title 
      AND c1.ArtistID = c2.ArtistID 
    ) 
0

Es ist wahrscheinlich eine effizientere Art und Weise, aber so etwas wie dies könnte das Problem für Sie löst: "das erste verglichenen Ergebnis"

SELECT * 
FROM LiveArt c1, 
(
    SELECT Title, ArtistID 
    FROM LiveArt 
    GROUP BY Title, ArtistID 
) c2 
WHERE c1.Title = c2.Title AND c1.ArtistID = c2.ArtistID 
AND c1.ARTID NOT IN 
( 
    SELECT MIN(ArtID) 
    FROM LiveArt 
    GROUP BY Title, ArtistID 
) 
+0

Entschuldigung, nur festgestellt, dass es in SQLLite, nicht SQL-Server war. Ich bin mir nicht sicher, ob Sie in der where-Klausel in sqllite eine Unterabfrage durchführen können – Greg

Verwandte Themen