2016-09-10 101 views
1

我正在學習SQL並嘗試使用SQL Server。我有兩張桌子。如何從SQL Server中的兩個表中查找MAX值?

表1

+------+--------+--------+ 
| IDK | CODE | NAME | 
+------+--------+--------+ 
| 1 | 742 | PEN | 
| 2 | 853 | PEN | 
| 3 | 724 | PAPPER | 
| 4 | 544 | PEN | 
| 5 | 451 | PRINTER| 
+------+--------+--------+ 

表2

+------+--------+ 
| IDK | QTY | 
+------+--------+ 
| 1 | 154 | 
| 2 | 85 | 
| 3 | 74 | 
| 4 | 44 | 
| 5 | 51 | 
+------+--------+ 

我想找到CODE用其名稱爲PEN最高QTY。 我有一個變量myname = "PEN"

我曾嘗試:

SELECT Table1.CODE 
FROM Table1 
INNER JOIN Table2 ON Table1.IDK = Table2.IDK 
WHERE Table2.QTY = (SELECT MAX(Table2.QTY) FROM Table2 WHERE Table1.NAME = :myname) 

我應該寫什麼,以便返回742

+0

您是否也可以添加'MTRDATA'表的詳細信息,以便其他人可以理解您正在嘗試的是什麼? – stom

+0

你是對的我現在修好了! – John

回答

1

公用表表達式真的可以爲這個問題非常有用。你真正想要查詢的「核心」表實際上是表1和表2。通過將這個連接放入CTE中,我們可以輕鬆地重用它以獲得您所尋求的答案。

;WITH cte AS 
(
SELECT t1.IDK, 
     t1.CODE, 
     t1.NAME, 
     t2.QTY 
FROM Table1 t1 
LEFT JOIN Table2 t2 
    ON t1.IDK = t2.IDK 
); 

SELECT t.CODE 
FROM cte t 
WHERE t.NAME = 'PEN' AND 
     t.QTY = (SELECT MAX(QTY) FROM cte WHERE NAME = 'PEN') 
+0

這很棒!但是你真的需要下面這行代碼:'t.NAME ='PEN'AND'? – John

+0

@John是的,我相信你需要這個。 「WHERE」子句的第一部分限制爲筆的記錄,第二部分選擇筆數最高的筆記錄。 –

+0

好吧,我同意但不包括在下面? t.QTY =(SELECT MAX(QTY)FROM cte WHERE NAME ='PEN'') – John

0

你可以得到最大,然後perorm一個JOIN

select t1.CODE 
from table1 t1 
join (select top 1 IDK from table2 order by QTY desc) xxx 
on t1.IDK = xxx.IDK 
where t1.Name = 'PEN'; 
0

它看起來像你在正確的軌道上,你應該調整你的簡單查詢之前去看點什麼 - 奧卡姆的剃刀。您只需要即可查詢,然後限制查詢結果的數量。這是主要的SQL分佈不一致的一個領域,我不確定是否由於製造商在SQL規範或流氓語言定義中缺乏設計。

在Oracle和Postgres中,您需要OFFSET和LIMIT,在MySQL中您只需要LIMIT;在IBM DB2中,您將使用FETCH FIRST,它們都位於查詢結尾附近。 使用T-SQL(用於MS SQL Server)時,您將在SELECT中使用TOP。

DECLARE @myname VARCHAR(32) = 'PEN' 

SELECT TOP 1 
    t1.CODE 
FROM Table1 t1 
INNER JOIN t2 
ON t1.IDK = t2.IDK 
WHERE t1.NAME = @myname 
ORDER BY t2.QTY 

在你的數據庫編程的階段,我警告你不要使用在內存中的表不瞭解後果的情況。它們是OLAP和其他分析的絕佳工具,但在資源受到競爭或受到約束的環境中可能會產生意想不到的性能影響。

此外,避免在可讀性,可維護性和性能不必要時嵌套查詢。每個嵌套級別都會爲處理的數據量添加一個維度,查詢時間與數據量的比率大致爲1:1。在這種情況下,嵌套和JOINing會對數據大小產生相同的影響,但嵌套將會妨礙某些數據庫的優化能力。在正確的目的下,這兩種策略都非常出色,但是作爲有人學習的人,確保你在依賴他們之前瞭解他們。

相關問題