2016-10-04 14 views
0

我一直在撞牆的東西,我覺得應該是簡單的,但不能工作。SQL分組。如何在連接時選擇列值最高的行。沒有CTE請

我試圖檢索與當我加入表A和表B中的最高值multi_flag行,但我似乎無法得到正確的SQL,因爲它返回所有行,而不是一個用最高的 multi_flag值。

這裏是我的表...

表A

enter image description here

表B

enter image description here

這幾乎是我想要的結果,但僅如果我離開出value_id

SELECT CATALOG, VENDOR_CODE, INVLINK, NAME_ID, MAX(multi_flag) AS multiflag 
FROM TBLINVENT_ATTRIBUTE AS A 
INNER JOIN TBLATTRIBUTE_VALUE AS B 
ON A.VALUE_ID = B.VALUE_ID 
GROUP BY CATALOG, VENDOR_CODE, INVLINK, NAME_ID 
ORDER BY CATALOG DESC 

enter image description here

這是接近我想要中檢索,但不太注意它是如何返回唯一name_id和最高multi_flag,但我也需要屬於這種multi_flag/name_id分組的value_id .. 。

如果我包括我的SQL語句value_id然後返回所有行,並且不再分組

諾蒂奇EIN下面的結果它如何不再返回最高multi_flag的行以及name_id(Ex。 name_id 1)也返回

enter image description here

+0

您正在使用的數據庫? ..刪除未使用的標誌 – scaisEdge

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 –

+0

小心瑣事 – rojobo

回答

1

您可以選擇使用一個子查詢,派生表或CTE來解決這個問題。性能將取決於您正在查詢的數據量。要實現獲得最大多標誌的目標,您必須首先根據要實現的分組獲得最大值,您可以使用CTE或子查詢。下面的CTE會給出最大multi_flag值,你可以使用它來獲得最大multi_flag,然後你可以使用它返回到其他表。在這個例子中我有三個連接,但是這可以減少,並且儘可能地使用子查詢可能會更好,但是直到獲得實際的執行計劃爲止。

;具有highest_multi_flag如 ( 選擇value_id,最大值(multi_flag)AS將multiflag FROM TBLINVENT_ATTRIBUTE 組由value_id ) 選擇A.CATALOG,a.VENDOR_CODE,a.INVLINK,b.NAME_ID,m.multiflag from highest_multi_flag m inner join TBLINVENT_ATTRIBUTE AS A上a.VALUE_ID = b。 m.VALUE_ID INNER JOIN TBLATTRIBUTE_VALUE爲B ON m.VALUE_ID = B.VALUE

+0

感謝您的回覆,我一定會嘗試這個,雖然我不知道CTE很好,還有其他建議嗎? @tywan – rojobo

+0

@rojobo - CTE已經是Tywan解決方案的一部分;沒有什麼可以「知道」他所描述的beyold。它是用'with'子句調用的。在沒有分析/窗口功能的情況下,我認爲這幾乎是實現您所尋求的最佳方式 – Hambone

+0

但我確信有這樣做的更好方法,這要感謝嘗試幫助。我正在尋找一種更傳統,更簡單的方法來解決這個CTE是不必要的。IMO – rojobo

0

您可以使用橫向過,它的其他解決方案

SELECT 
    A.CATALOG, A.VENDOR_CODE, A.INVLINK, B.NAME_ID, M.maxmultiflag 
    FROM TBLINVENT_ATTRIBUTE AS A 
    inner join lateral 
    (
    select max(B.multi_flag) as maxmultiflag from TBLINVENT_ATTRIBUTE C 
    where A.VALUE_ID = C.VALUE_ID 
) M on 1=1 
    INNER JOIN TBLATTRIBUTE_VALUE AS B ON M.maxmultiflag = B.VALUE 
相關問題