SQL有许多查询选择1

SQL有许多查询选择1,sql,sql-server,Sql,Sql Server,我有两个表要查询 库存表 股票代码 股票名称 实物库存 订单表 订单日期 量 股票代码 我正在查找所有库存记录,其中实际库存大于0,以及最后一次订购日期 我认为下面的查询可以做到这一点,但这会复制每个订单数量的库存记录 SELECT Stock_Code, Physical_Stock, Order_Date FROM Stock_Table INNER JOIN Order_Table ON Stock_Table.Stock_code = Order_Tabl

我有两个表要查询

库存表

股票代码 股票名称 实物库存 订单表

订单日期 量 股票代码 我正在查找所有库存记录,其中实际库存大于0,以及最后一次订购日期

我认为下面的查询可以做到这一点,但这会复制每个订单数量的库存记录

SELECT
    Stock_Code,
    Physical_Stock,
    Order_Date
FROM Stock_Table
INNER JOIN Order_Table
    ON Stock_Table.Stock_code = Order_Table.Stock_Code
WHERE Physical_Stock <> 0

以下是交叉应用top 1解决方案:

SELECT Stock_Code, Physical_Stock, Order_Date
FROM 
    Stock_Table
    CROSS APPLY
    (
        SELECT TOP 1 Order_Date
        FROM Order_Table 
        WHERE Stock_Table.Stock_code = Order_Table.Stock_Code
        order by Order_Date desc
    )q
Where Physical_Stock <> 0
如果您愿意,也可以从最近的orderdate中提取更多列。

大于0或0是哪个

您只需要使用聚合函数max来获取最大订单日期,因为可以为给定的股票代码下多个订单。由于您使用聚合,因此非聚合列需要group by

SELECT Stock_Code, Physical_Stock, max(Order_Date)
FROM Stock_Table 
INNER JOIN Order_Table 
  ON Stock_Table.Stock_code = Order_Table.Stock_Code
WHERE Physical_Stock <> 0
GROUP BY Stock_Code, Physical_Stock
使用GroupBy

SELECT 
  Stock_Table.Stock_Code, 
  Max(Physical_Stock) As Stock, 
  Max(Order_Date) As LastDate
FROM  
  Stock_Table INNER JOIN 
  Order_Table ON Stock_Table.Stock_code = Order_Table.Stock_Code
Where Physical_Stock > 0
Group By Stock_Table.Stock_Code

你需要maxorder_date和group by stock_code,Physical_stock,你说stock>0,但显示不等于0,这是什么?Physical stock不能小于0,所以0在逻辑上可以工作。K,我曾使用过许多系统,其中stock可能是负面的,例如我们刚发货的产品;但是hand还没有完成系统更新,显示它已经签入了。这样行吗?我不认为可以在where中限制窗口函数的选择结果,因为where在选择之前执行;这就是为什么我经常在子查询或CTE中看到winnow函数的原因。@xQbert我更新了我的答案,并用测试数据进行了测试,它确实会返回每个唯一的库存项目及其最近的购买日期。@xQbert是的,谢谢你的更正,如果没有SQL,我不太擅长写这些东西,你会明白的,多年来,当你开始识别模式中的模式/错误时,写下这么多这些内容。@xQbert谢谢你的鼓励,我很感激。是的,这确实是一种从订单表中获取额外列的有用技术。只需要安装在更新版本的SQL server上。不知道交叉申请什么时候来的。。。2012? 哇2005。。。伟大的解决方案我需要更新我对这些技术的使用。。我太老了。为什么maxphysical\u Stock它来自Stock表,而order\u date是order\u表,因此1:m问题在order表上。假设stock_代码是PK,那么在一个唯一的值上得到一个最大值似乎很奇怪……这确实看起来很奇怪,但因为它来自关系的1方,所以它可以工作,而且我认为它比具有多列的GroupBy更快。回答不错,+1
SELECT 
  Stock_Table.Stock_Code, 
  Max(Physical_Stock) As Stock, 
  Max(Order_Date) As LastDate
FROM  
  Stock_Table INNER JOIN 
  Order_Table ON Stock_Table.Stock_code = Order_Table.Stock_Code
Where Physical_Stock > 0
Group By Stock_Table.Stock_Code