Sql server 2008 如何从SQL Server中的两个表中查找最大值?

Sql server 2008 如何从SQL Server中的两个表中查找最大值?,sql-server-2008,max,Sql Server 2008,Max,我正在学习SQL并尝试使用SQL Server。我有两张桌子 表1 +------+--------+--------+ | IDK | CODE | NAME | +------+--------+--------+ | 1 | 742 | PEN | | 2 | 853 | PEN | | 3 | 724 | PAPPER | | 4 | 544 | PEN | | 5 | 451 | PRINTER|

我正在学习SQL并尝试使用SQL Server。我有两张桌子

表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   |
+------+--------+
我想找到数量最大的代码,它的名字是PEN。 我有一个变量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,我应该写些什么?

您可以获得最大值,然后像这样进行连接


对于这个问题,公共表表达式确实很有用。您真正想要查询的核心表实际上是表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')

看起来你的思路是对的,在去奥卡姆剃须刀之前,你应该调整一下你的简单查询。您只需要对查询进行排序,然后限制查询结果的数量。这是一个主要SQL发行版不一致的领域,我不确定这是否是由于SQL规范中缺乏设计或制造商的流氓语言定义造成的

在Oracle和Postgres中,您需要偏移量和限制,在MySQL中,您只需要限制,在IBM DB2中,您将首先使用FETCH,所有这些都位于查询的末尾。在使用T-SQL for MS SQL Server时,您将在选择中使用TOP

在数据库编程阶段,我警告您不要在不了解后果的情况下使用内存中的表。它们是OLAP和其他分析的极好工具,但在资源受到竞争或约束的环境中可能会产生意外的性能后果


此外,避免在可读性、可维护性和性能不必要时嵌套查询。每一层嵌套都会为处理的数据量增加一个维度,查询时间与数据量的比例约为1:1。在这种情况下,嵌套和连接将对数据大小产生相同的影响,但嵌套将排除某些数据库的优化能力。在正确的目的下,这两种策略都很好,但作为学习者,在依赖它们之前,请确保您了解这两种策略。

您是否也可以添加MTRDATA表的详细信息,以便其他人能够了解您正在尝试的具体内容?您是对的,我现在已经修复了它!真是太棒了!但是你真的需要下面这行代码吗:t.NAME=‘PEN’和?@John是的,我相信你需要这个。WHERE子句的第一部分限制记录为笔,第二部分选择笔数最多的笔记录。好的,我同意,但你不在下面列出吗?t、 QTY=从cte中选择MAXQTY,其中NAME='PEN'这只是标识最大值的子查询。您仍然需要在实际查询中限制表。
;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')
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