2010-07-02 47 views
5

Tôi đang sử dụng SQL Server 2008 và tôi có 3 bảng, x, yz. y tồn tại để tạo mối quan hệ nhiều-nhiều giữa xz.Giá trị tối đa trong mối quan hệ nhiều-nhiều

x  y  z 
--  --  -- 
id xid  id 
     zid sort 

Tất cả các trường ở trên là int.

Tôi muốn tìm phương pháp hoạt động tốt nhất (không bao gồm việc không chuẩn hóa) tìm số z với số cao nhất sort cho bất kỳ x và trả lại tất cả các trường từ cả ba bảng.

mẫu dữ liệu:

x: id 
    -- 
     1 
     2 

y: xid zid 
    --- --- 
     1 1 
     1 2 
     1 3 
     2 2 

z: id sort 
    -- ---- 
    1 5 
    2 10 
    3 25 

Result bộ nên

xid zid 
--- --- 
    1 3 
    2 2 

Lưu ý rằng nếu có nhiều hơn một z tồn tại với cùng một giá trị cao nhất sort, sau đó tôi vẫn chỉ muốn một hàng cho mỗi x.

Cũng lưu ý rằng trong tình huống thực tế của tôi, có các trường khác trong cả ba bảng mà tôi sẽ cần trong tập kết quả của mình.

+0

Tôi cho rằng bạn đang theo giải pháp của tình huống thế giới thực? Tôi khuyên bạn nên cập nhật câu hỏi của mình bằng một vài trường bổ sung cho mỗi bảng và xác định những gì bạn muốn tập hợp kết quả của mình tìm kiếm. – MPritchard

+0

Chỉ để thêm vào câu hỏi này. Thiết kế cơ sở dữ liệu của bạn đã được sửa hay vẫn đang được triển khai? Tôi thấy lạ rằng "sắp xếp" của bạn nằm trong bảng z và không nằm trong bảng y. Tôi thường thấy rằng một mối quan hệ nhiều đến nhiều như thế này thường có loại mà "z" bạn có thể quan tâm trên bảng "y". Bỏ qua tôi nếu tôi là sai mặc dù, nó không thể biết mà không có bối cảnh. –

+0

Nó vẫn đang được thực hiện và tôi đồng ý với những gì bạn nói, nhưng trong bối cảnh của những gì đang được xây dựng, sắp xếp là và nên được trên bảng 'z'. – enashnash

Trả lời

0

Một phương pháp có truy vấn phụ. Tuy nhiên điều này chỉ tốt cho việc nhận được ID của Z. Nếu bạn cần thêm/tất cả các cột từ cả hai bảng x và z thì đây không phải là giải pháp tốt nhất.

SELECT 
    x.id, 
    (
     SELECT TOP 1 
      z.zid 
     FROM 
      y 
     INNER JOIN 
      z 
     ON 
      z.id = y.zid 
     WHERE 
      y.xid = x.id 
     ORDER BY 
      z.sort DESC 
    ) 
FROM 
    x 

Đây là cách bạn có thể thực hiện và trả lại tất cả dữ liệu từ tất cả các bảng.

SELECT 
    * 
FROM 
    x 
INNER JOIN 
    y 
ON 
    y.xid = x.id 
AND 
    y.zid = 
(
    SELECT TOP 1 
     z2.zid 
    FROM 
     y y2 
    INNER JOIN 
     z z2 
    ON 
     z2.id = y2.zid 
    WHERE 
     y2.xid = x.id 
    ORDER BY 
     z2.sort DESC 
) 
INNER JOIN 
    z 
ON 
    z.id = y.zid 
+0

được làm rõ trong câu hỏi – enashnash

+0

được chỉnh sửa để bao gồm tất cả dữ liệu –

+0

Tôi vừa so sánh điều này với giải pháp được cung cấp bởi loài nhện và nhanh hơn 8% trong ngữ cảnh cho tôi. – enashnash

0
select xid,max(zid) as zid from y 
group by xid 
+0

tối đa có nghĩa là để được "sắp xếp" không phải trên zid. do đó, điều này không hoạt động –

0
select xid, zid /* columns from x; and columns from y or z taken from q */ 
from (select y.xid, y.zid, /* columns from y or z */ 
      row_number() over(partition by y.xid order by z.sort desc) r 
     from y 
      join z on z.id = y.zid 
    ) q 
    join x on x.id = q.xid 
where r = 1 
+0

Tôi nghĩ rằng đây là những gì tôi đang tìm kiếm. Tôi có thể thêm các cột bổ sung vào lựa chọn bên trong và sau đó chọn từ các cột bên ngoài để lấy tất cả các cột trong cả ba bảng. Bây giờ tôi chỉ cần biết đây có phải là cách thực hiện tốt nhất. – enashnash

Các vấn đề liên quan