2016-11-04 22 views
7

Tôi có một cái gì đó giống như truy vấnngoài trái tham gia với chỉ hàng đầu tiên

SELECT S.product_id, S.link, C.id AS category_id 
FROM Products P 
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1 
LEFT OUTER JOIN Categories C ON c.product_id = P.id 
WHERE P.active = 1 

tôi hoạt động tốt đối với tôi miễn là mỗi sản phẩm đã được phân công chỉ có một loại. Nhưng nếu một sản phẩm được gán cho nhiều loại, nó trả về tất cả các kết hợp có thể.

Tôi có thể chỉ chọn một trong những đầu tiên và nếu một sản phẩm không có bất kỳ loại liên kết vẫn nên được trả lại với category_id = NULL

+6

'Cái đầu tiên', theo tiêu chí nào? – Lamak

+0

Bạn có thể thêm MIN hoặc MAX và GROUP BY vào category_id. Nếu điều đó không đủ tốt, hãy chuyển Danh mục thành truy vấn phụ. – Stavr00

Trả lời

4

Một cách dễ dàng là sử dụng bên ngoài áp dụng, để có một tương quan tham gia, và làm cho điều đó 1 truy vấn hàng đầu. Vì vậy, bạn có thể truy cập tất cả các cột của bản ghi danh mục được đề cập. Tôi đang thêm tên danh mục ở đây làm ví dụ:

select s.product_id, s.link, c.id as category_id, c.name as category_name 
from products p 
inner join seo s on s.product_id = p.id 
outer apply 
(
    select top 1 * 
    from categories cat 
    where cat.product_id = p.id 
    order by cat.id 
) c 
where p.active = 1 
and p.product_type = 1; 
+0

Bằng cách sử dụng Bên ngoài áp dụng nó cũng có thể đặt hàng theo bất kỳ cột nào trên bảng danh mục mà có lẽ là những gì anh ta cần. – Magnus

3

Bạn có thể sử dụng một GROUP BY để thực hiện điều này cùng với một chức năng Aggregate, hầu hết có thể là MIN hoặc MAX.

Tùy thuộc vào ID danh mục bạn muốn trong kết quả của mình, bạn có thể chọn mức tối thiểu.

SELECT S.product_id, S.link, MIN(C.id) AS category_id 
FROM Products P 
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1 
LEFT OUTER JOIN Categories C ON c.product_id = P.id 
WHERE P.active = 1 
GROUP BY S.product_id, S.link 

Hoặc tối đa.

SELECT S.product_id, S.link, MAX(C.id) AS category_id 
FROM Products P 
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1 
LEFT OUTER JOIN Categories C ON c.product_id = P.id 
WHERE P.active = 1 
GROUP BY S.product_id, S.link 
1

giải pháp thay thế sử dụng subquery:

SELECT S.product_id, S.link, 
(
SELECT C.id FROM Categories C WHERE C.product_id = P.id AND 
ROW_NUMBER() OVER(ORDER BY /* your sort option goes here*/) = 1 
) AS category_id 
FROM Products P 
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1 
WHERE P.active = 1 
Các vấn đề liên quan