Kann ich SELECT TOP () mit dem IN-Operator kombinieren?


7

Ich habe mich gefragt, ob es eine Möglichkeit gibt, eine SELECTAbfrage für jeden übereinstimmenden Wert in IN durchzuführen.

Beachten Sie, dass die folgende Tabelle 100 Datensätze für jeden der vom INOperator angegebenen Werte enthält. Ich möchte, dass für jede Übereinstimmung nur 50 zurückgegeben werden.

SELECT TOP (50) COLUMN 
FROM TABLE 
WHERE COLUMN IN (1,2,3)

Gibt es eine effiziente Möglichkeit, dies zu tun?

Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, die Abfrage für jeden Wert auszuführen, der INviel zu langsam wäre, wenn man bedenkt, dass die tatsächliche Abfrage viele Spalten aus verschiedenen Tabellen abruft.


Sie benötigen in 50 RANDOM-Datensätzen für jeden COLUMN-Wert? oder TOP 50 beim Sortieren nach einem Ausdruck? Wenn zuletzt - was ist, wenn der 50. und 51. Datensatz denselben Exopressionswert haben?
Akina

@Akina Sortierung ist erforderlich. In dem Kontext, in dem ich dies verwende, stimmen mehrere Zeilen nicht mit demselben Ausdruckswert überein
Abs

Antworten:


10

Eine Methode ist mit CROSS APPLY:

SELECT top_50.ColumnName
FROM (VALUES(1),(2),(3)) AS id_list(ID)
CROSS APPLY(SELECT TOP(50) t.ColumnName 
    FROM TableName AS t 
    WHERE t.ID = id_list.ID 
    ORDER BY t.ColumnName) AS top_50;

Um zu vermeiden, dass zufällige Zeilen mit zurückgegeben werden TOP, ORDER BYist dies erforderlich, und die Reihenfolge nach Spalten sollte eindeutig sein. Ein Index mit einem zusammengesetzten Schlüssel IDund ColumnNameist in dieser Beispielabfrage aus Effizienzgründen hilfreich.


6

Sie können dafür verwenden ROW_NUMBER():

SELECT a, b, c
FROM (
    SELECT a, b, c, ROW_NUMBER() OVER (PARTITION BY match_column ORDER BY d) AS rn
    FROM t
    WHERE match_column IN (1, 2, 3)
) AS x
WHERE rn <= 50

Ich habe nicht verstanden, was a, b, c hier machen. Ich habe mich gefragt, ob Sie bitte etwas mehr erklären könnten.
Vielen

1
@Pantea a, b, c sind fiktive Spaltennamen, die Sie in den Ergebnissen sehen möchten (und d ist die fiktive Spalte, die zum Ordnen der Ergebnisse verwendet wird). Es ist immer besser, die gewünschten Spalten in den Ergebnissen zu benennen, alsSELECT * FROM...
Salman A
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.