Tôi có thể kết hợp CHỌN TOP () với toán tử IN không?


7

Tôi đã tự hỏi nếu có một cách để thực hiện một SELECTtruy vấn trên mỗi giá trị phù hợp được tìm thấy trong IN.

Hãy xem xét bảng dưới đây chứa 100 bản ghi cho mỗi giá trị được bao gồm bởi INtoán tử, tôi chỉ muốn trả lại 50 cho mỗi trận đấu.

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

Có một cách hiệu quả tôi có thể làm điều này?

Cách duy nhất tôi có thể nghĩ đến là thực hiện truy vấn cho từng giá trị trong INđó sẽ quá chậm khi xem xét truy vấn thực tế lấy nhiều cột từ nhiều bảng khác nhau.


Bạn cần trong 50 bản ghi RANDOM cho mỗi giá trị CỘT? hoặc TOP 50 trong khi sắp xếp theo một số biểu thức? Nếu cuối cùng - điều gì sẽ xảy ra nếu các bản ghi thứ 50 và 51 có cùng giá trị ngoại lệ?
Akina

@Akina Sắp xếp là bắt buộc. Trong ngữ cảnh tôi đang sử dụng, nhiều hàng sẽ không khớp với cùng một giá trị biểu thức
abs

Câu trả lời:


10

Một phương pháp là với 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;

Để tránh trả về các hàng ngẫu nhiên với TOP, ORDER BYlà cần thiết và thứ tự các cột phải là duy nhất. Một chỉ mục có khóa tổng hợp bật IDColumnNamesẽ hữu ích trong truy vấn ví dụ này về hiệu quả.


6

Bạn có thể sử dụng ROW_NUMBER()cho việc này:

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

Tôi không hiểu a, b, c đang làm gì ở đây. Tôi đã tự hỏi nếu bạn có thể giải thích thêm một chút xin vui lòng. cảm ơn trước
Pantea Tourang

1
@Pantea a, b, c là các tên cột hư cấu mà bạn muốn thấy trong kết quả (và d là cột hư cấu được sử dụng để đặt hàng kết quả). Thay vào đó, tốt hơn là đặt tên cho các cột bạn muốn trong kết quả thay vìSELECT * FROM...
Salman A
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.