我一直試圖根據一個表的最大列值進行連接。 下面是我的表結構
表A:
| ID | Val | text |
| 1 | 423 | tuh |
| 2 | 369 | foo |
| 3 | 568 | bars|
表B:
| Val | Label |
| 423 | 阿德里亞 |
| 369 | 阿德里亞 |
| 568 | 阿德里亞 |
表C:
| Label | Val |
| Adria | 100 |
| Fox | 123 |
我已經嘗試了這個查詢,但由于某些原因,我仍然沒有得到基于表A中最大值的結果
。select C.Label, A.txt
from C join
B
on B.Label= C.Labelleft join
A
on A.Val =B.Val and
A.Val = (select max(A. Val) Val) from A as a where a.Val = A.val)
where C.Lable = 'Adria'/span>
輸出:
Adria tuh
阿德里安-福
阿德里亞酒吧
預期輸出:
Adria bars
誰能幫忙指出我錯過了什么?
uj5u.com熱心網友回復:
僅根據所提供的樣本資料,這個條款沒有任何意義。
A.Val = (select max(A.Val) select maxmax(A.Val) Val) from A as a where a.Val = A.Val)
...一個匹配單行的自連接,然后從該單行中獲取連接列的max()。 以Val = 423為例,我們看到...
423 = (selectmax(423) from A as a where 423 = 423)
--或
423 = 423 >。
事實上,如果我們完全洗掉這個子句:
。select C.Label, A.text
from C join
B
on B.Label= C.Labelleft join
A
on A.Val = B.Val
-- and
--A.Val = (select max(A.Val) from A as a where a.Val = A.Val)
where C.Label = 'Adria'/span>
我們得到同樣的結果:
標簽文本
-------------------- --------------------
阿德里亞圖
阿德里安-福
阿德里亞酒吧
回到如何生成預期輸出的問題上......
另外,僅僅基于所提供的樣本資料,bars是你得到的,如果你在整個表A上應用max(Val)(甚至max(ID))進行連接,例如:
select C.Label, A.text
from C join
B
on B.Label= C.Labelleft join
A
on A.Val =B.Val and
A.Val = (select max(Val) from A)
where C.Label = 'Adria'>
去
'當然,由于左鍵連接,這給了我們:
標簽文本
-------------------- --------------------
阿德里亞NULL
阿德里亞NULL
阿德里亞酒吧
1)消除left join:
select C.Label, A.text
from C join
B
on B.Label = C.Label /* left */ join
A
on A.Val =B.Val and
A.Val = (select max(Val) from A)
where C.Label = 'Adria'>
去
2)通過將max()測驗移到where子句中來過濾結果:
select C.Label, A.text
from C join
B
on B.Label= C.Labelleft join
A
on A.Val = B.Val -- and 2.
-- A.Val = (select max(Val) from A)
where C.Label = 'Adria'/span>
and A.Val = (select max(Val) from A)
去
兩者都會產生:
標簽文本
-------------------- --------------------
阿德里亞酒吧
然而,在這一點上,我有幾個問題 ......
-
<
- 連接(
A.Val = B.Val)是否有時不能找到A中的記錄(因此需要左連接的原因)? max(A.Val)或... 的目的是什么?
- 連接(
A.Val = B.Val)是否真的能在A中找到多條記錄(因此有max(Val)的原因)?
這使我認為這個問題(樣本資料、樣本查詢)是真正問題(更多列、更多資料、更大更復雜的查詢)的淡化版本。 如果是這樣的話,那么(在我看來)在創建這個問題的程序中,真正問題的關鍵方面可能已經被混淆了。
注意:上述查詢(如果沒有任何代表我的剪切-粘貼的錯字)是在ASE 15.7 SP140上運行的。
uj5u.com熱心網友回復:
你的查詢應該作業,盡管條件是多余的:
你的查詢應該作業,盡管條件是多余的。
a.val = A.val
這既是對子查詢中的表的參考。 所以,它等同于1=1。 實際上,它實際上等同于a.val is not null。
由于這個條件,我認為你在將你的查詢轉錄為問題時犯了一個錯誤。
你可以使用TOP更簡單地實作你想要的東西:
select C.Label, A.txt
from C join
B
on B.Label = C.Label left join
(select top (1) a.*
from A
order by val desc
) a
on A.Val = B.Val
where C.Label = 'Adria'/span>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322160.html
標籤:
下一篇:設定定義永久關閉
