2010-07-02 72 views
5

我使用SQL Server 2008,我有3個表,x,yzy存在以創建xz之間的多對多關係。多對多關係中的最大值

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

以上所有字段均爲int

我想找到zsort的最高性能方法(排除非規格化),並返回所有三個表中的所有字段。

的樣本數據:

x: id 
    -- 
     1 
     2 

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

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

結果集應該是

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

注意,如果超過一個z具有相同的最高sort值存在,那麼我還是隻想每x一行。

還請注意,在我的現實世界的情況下,在我的結果集中需要的三個表中都有其他字段。

+0

我相信你的現實世界的情況的解決方案後是?我建議你用每個表格的幾個額外字段來更新你的問題,並定義你想要的結果集。 – MPritchard 2010-07-02 09:14:10

+0

只是爲了補充這個問題。您的數據庫設計是否已修復或仍在實施?我發現奇怪的是,你的「排序」是在z表中,而不是在y表中。我通常會發現,像這樣的多對多關係通常具有您在「y」表上可能感興趣的「z」類型。如果我錯了,不要理會我,沒有上下文就不可能知道。 – 2010-07-02 10:23:22

+0

它仍在實施中,我同意你所說的,但在正在構建的內容中,排序是和應該在'z'表上。 – enashnash 2010-07-02 11:01:28

回答

0

一種方法是用子查詢。然而,這隻適用於獲取Z的ID。如果您需要x和z表中的更多/全部列,那麼這不是最佳解決方案。

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 

這是如何做到這一點,並返回所有表中的所有數據。

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

澄清問題 – enashnash 2010-07-02 09:08:25

+0

編輯包含所有數據 – 2010-07-02 09:51:57

+0

我剛剛比較了這與蛛形綱動物提供的解決方案,它出來了8%的速度在我的上下文。 – enashnash 2010-07-02 14:27:31

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

最大值意味着不在zid上進行「排序」。因此這是行不通的 – 2010-07-02 09:00:07

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

我認爲這是我正在尋找的。我可以將其他列添加到內部選擇,然後從外部選擇它們以獲取所有三個表中的所有列。 現在我只需要知道這是否是表現最佳的方式。 – enashnash 2010-07-02 09:40:43