2016-04-04 1 views
1
beschränkt

Ich habe bestimmte Zeilen in der Datenbank, sagen customer_id in ('c7', 'c77', 'c777'), die ich in meinem Abfrageergebnis enthalten möchte, die ich als ein Beispiel sowie für Testzwecke verwenden werde. Gleichzeitig möchte ich, dass das zurückgegebene Ergebnis bis zu 10.000 Zeilen enthält. Der angegebene Filter customer_id darf jedoch nur etwa 100 Zeilen enthalten.SQL: Werte in Filter einschließen, aber nicht auf

Gibt es eine SQL-Funktion oder -Syntax (eines beliebigen Typs, falls vorhanden), die die gesuchten Zeilen plus den Rest von limit enthält (zufällig oder gemäß SQL-Standard ausgewählt), enthalten in einer einzelnen SELECT-Anweisung, ohne zu verwenden UNION?

+0

Welche DBMS verwenden Sie? –

+0

Haben Sie SELECT-Anweisung mit "UND" versucht ?? –

+0

Ehrlich gesagt, ich benutze Dremel, aber da ich ein komplettes Noob in Dremel und RDBMS SQL bin, was ich weiß, deshalb frage ich zuerst, ob solche im RDBMS-Bereich existieren, dann vielleicht versuchen, ob es auch in Dremel funktioniert. – menorah84

Antwort

1

Nun, Sie haben geben Sie nicht DBMS, so für ORACLE:

SELECT * FROM (
    SELECT * FROM Customers c 
    WHERE c.customer_id in('c7','cc7',.......) 
)WHERE rownum <= 10000; 

Für SQL-Server:

SELECT TOP 10000 * 
FROM Customers c 
WHERE c.customer_id in('c7','cc7',.......); 

Für MySQL:

FROM Customers c 
WHERE c.customer_id in('c7','cc7',.......) 
LIMIT 10000; 

Dies ist die erste Auswahl wird 10000 Zeilen mit den IDs, die im IN() Stat aufgelistet sind gemäß dem DBMS-Standard. Sie können eine order by-Klausel zu jedem von ihnen hinzufügen, um anzugeben, welche 10K-Datensätze Sie möchten.

1

Sie können alle Zeilen abfragen, sie nach ihrer Eignung für diese Bedingung sortieren und das zurückgegebene Ergebnis einschränken.

MySQL:

SELECT * 
FROM  customers 
ORDER BY CASE WHEN customer_id IN ('c7', 'c77', 'c777') THEN 1 ELSE 0 END DESC 
LIMIT 10000 

MS SQL Server:

SELECT TOP 10000 * 
FROM  customers 
ORDER BY CASE WHEN customer_id IN ('c7', 'c77', 'c777') THEN 1 ELSE 0 END DESC 

Oracle 12c:

SELECT * 
FROM  customers 
ORDER BY CASE WHEN customer_id IN ('c7', 'c77', 'c777') THEN 1 ELSE 0 END DESC 
FETCH FIRST 10000 ROWS ONLY 

ANSI SQL mit Fensterfunktionen:

SELECT * 
FROM  (SELECT *, 
       ROW_NUMBER() OVER 
        (ORDER BY CASE 
           WHEN customer_id IN ('c7', 'c77', 'c777') THEN 1 
           ELSE 0 END DESC) rn 
      FROM customers) t 
WHERE rn <= 10000 
Verwandte Themen