Sql 在子查询中使用ORDERBY时出错(ORDERBY子句在视图、内联函数、派生表和子查询中无效)

Sql 在子查询中使用ORDERBY时出错(ORDERBY子句在视图、内联函数、派生表和子查询中无效),sql,sql-server,join,sql-order-by,Sql,Sql Server,Join,Sql Order By,除非还指定了TOP或FOR XML,否则ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效 我使用join从三个表中获取结果。现在,结果是我得到了RMA_ID的多个记录,但我只想要基于TBL_RMA_SHIPPING.SHIP_ADMIN_状态的最新记录 我在查询中遇到了这个错误。请帮帮我 SELECT RMA_ENQUIRY.RMA_ID, PART_NUMBER_TBL.PART_NO, PART_SERIAL.SERIAL_NUM,

除非还指定了TOP或FOR XML,否则ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效

我使用join从三个表中获取结果。现在,结果是我得到了RMA_ID的多个记录,但我只想要基于TBL_RMA_SHIPPING.SHIP_ADMIN_状态的最新记录

我在查询中遇到了这个错误。请帮帮我

SELECT RMA_ENQUIRY.RMA_ID,
       PART_NUMBER_TBL.PART_NO, 
       PART_SERIAL.SERIAL_NUM,
       RMA_ENQUIRY.RMA_TYPE,
       RMA_ENQUIRY.RMA_FAILURE_TYPE,
       RMA_ENQUIRY.RMA_COMPLAINT,
       RMA_ENQUIRY.RMA_ADDITIONAL_INFORMATION,
       RMA_ENQUIRY.RMA_REC_DATE,
       RMA_ENQUIRY.RMA_STATUS,
       RMA_ENQUIRY.RMA_SHIP_STATUS,
       (select TBL_RMA_SHIPPING.SHIP_ADMIN_STATUS from TBL_RMA_SHIPPING where TBL_RMA_SHIPPING.SHIP_RMAID=RMA_ENQUIRY.RMA_ID order by TBL_RMA_SHIPPING.UPDATE_STATUS_DATE),
       RMA_ENQUIRY.[USER_ID],
       TBL_RMA_SHIPPING.SHIP_DETAILS
  FROM RMA_ENQUIRY 
       LEFT JOIN PART_NUMBER_TBL 
                  ON RMA_ENQUIRY.RMA_PART_NO=PART_NUMBER_TBL.PARTID 
       LEFT JOIN PART_SERIAL 
                  ON RMA_ENQUIRY.RMA_SERIAL_NO=PART_SERIAL.SERIAL_ID
       LEFT JOIN TBL_RMA_SHIPPING ON RMA_ENQUIRY.RMA_ID=TBL_RMA_SHIPPING.SHIP_RMAID
                  WHERE RMA_ENQUIRY.RMA_STATUS='A' AND RMA_ENQUIRY.RMA_SHIP_STATUS=1
                  ORDER BY RMA_ENQUIRY.RMA_REC_DATE DESC
如果你只是想要max

SELECT RMA_ENQUIRY.RMA_ID,
       PART_NUMBER_TBL.PART_NO, 
       PART_SERIAL.SERIAL_NUM,
       RMA_ENQUIRY.RMA_TYPE,
       RMA_ENQUIRY.RMA_FAILURE_TYPE,
       RMA_ENQUIRY.RMA_COMPLAINT,
       RMA_ENQUIRY.RMA_ADDITIONAL_INFORMATION,
       RMA_ENQUIRY.RMA_REC_DATE,
       RMA_ENQUIRY.RMA_STATUS,
       RMA_ENQUIRY.RMA_SHIP_STATUS,
       max(TBL_RMA_SHIPPING.SHIP_ADMIN_STATUS), 
       RMA_ENQUIRY.[USER_ID],
       TBL_RMA_SHIPPING.SHIP_DETAILS
  FROM RMA_ENQUIRY 
       LEFT JOIN PART_NUMBER_TBL 
                  ON RMA_ENQUIRY.RMA_PART_NO=PART_NUMBER_TBL.PARTID 
       LEFT JOIN PART_SERIAL 
                  ON RMA_ENQUIRY.RMA_SERIAL_NO=PART_SERIAL.SERIAL_ID
       LEFT JOIN TBL_RMA_SHIPPING ON RMA_ENQUIRY.RMA_ID=TBL_RMA_SHIPPING.SHIP_RMAID
                  WHERE RMA_ENQUIRY.RMA_STATUS='A' AND RMA_ENQUIRY.RMA_SHIP_STATUS=1

GROUP BY RMA_ENQUIRY.RMA_ID,
       PART_NUMBER_TBL.PART_NO, 
       PART_SERIAL.SERIAL_NUM,
       RMA_ENQUIRY.RMA_TYPE,
       RMA_ENQUIRY.RMA_FAILURE_TYPE,
       RMA_ENQUIRY.RMA_COMPLAINT,
       RMA_ENQUIRY.RMA_ADDITIONAL_INFORMATION,
       RMA_ENQUIRY.RMA_REC_DATE,
       RMA_ENQUIRY.RMA_STATUS,
       RMA_ENQUIRY.RMA_SHIP_STATUS,
       RMA_ENQUIRY.[USER_ID],
       TBL_RMA_SHIPPING.SHIP_DETAILS
       ORDER BY RMA_ENQUIRY.RMA_REC_DATE DESC

在SELECT子句中使用子查询时,只能返回1个值。使用Top 1将确保返回单个值。如果没有它,查询优化器会假设将返回多个值,这就是为什么首先要对数据进行排序


如果在FROM子句中使用子查询,则顺序无关紧要,因为它将根据on条件进行联接。在这种情况下,TOP可用于根据业务需求限制结果集。但是,使用TOP子句可以获得有序数据以提高联接性能。在FROM子句中使用子查询时,允许多条记录。

您收到原始帖子中描述的错误的原因是,正如上面所说的,在主选择中的子选择中,您无法在那里获得订单。xQbert的解决方案将只获得具有该最大值的记录。例如,如果您有一个表“电影”\u“视图”\u“历史记录”,如下所示:

|movie_id|view_date|
--------------------
|  1     |1/1/2014 |
|  1     |1/2/2014 |
|  2     |2/1/2014 |
|  2     |2/2/2014 |
xQbert的解决方案将返回:

select movie_id, MAX(view_date)
from movie_view_history
group by movie_id

|movie_id|view_date|
--------------------
|  1     |1/2/2014 |
|  2     |2/2/2014 |
但是,如果您想返回以下内容,谁知道呢,可能您有业务原因:

select 
    movie_id,
    (select max(view_date)
     from movie_view_history as [A]
     where [A].movie_id = [B].movie_id)
from movie_view_history as [B]

|movie_id|view_date|
--------------------
|  1     |1/2/2014 |
|  1     |1/2/2014 |
|  2     |2/2/2014 |
|  2     |2/2/2014 |
然后,您可以使用以下选项:

SELECT 
  RMA_ENQUIRY.RMA_ID,
   PART_NUMBER_TBL.PART_NO, 
   PART_SERIAL.SERIAL_NUM,
   RMA_ENQUIRY.RMA_TYPE,
   RMA_ENQUIRY.RMA_FAILURE_TYPE,
   RMA_ENQUIRY.RMA_COMPLAINT,
   RMA_ENQUIRY.RMA_ADDITIONAL_INFORMATION,
   RMA_ENQUIRY.RMA_REC_DATE,
   RMA_ENQUIRY.RMA_STATUS,
   RMA_ENQUIRY.RMA_SHIP_STATUS,
   (select [B].SHIP_ADMIN_STATUS from TBL_RMA_SHIPPING AS [B] where [B].SHIP_RMAID=[A].SHIP_RMAID) AS [SHIP_ADMIN_STATUS],
   RMA_ENQUIRY.[USER_ID],
   [A].SHIP_DETAILS
FROM RMA_ENQUIRY 
   LEFT JOIN PART_NUMBER_TBL 
              ON RMA_ENQUIRY.RMA_PART_NO=PART_NUMBER_TBL.PARTID 
   LEFT JOIN PART_SERIAL 
              ON RMA_ENQUIRY.RMA_SERIAL_NO=PART_SERIAL.SERIAL_ID
   LEFT JOIN TBL_RMA_SHIPPING AS [A] ON RMA_ENQUIRY.RMA_ID=[A].SHIP_RMAID
WHERE RMA_ENQUIRY.RMA_STATUS='A' AND RMA_ENQUIRY.RMA_SHIP_STATUS=1
ORDER BY RMA_ENQUIRY.RMA_REC_DATE DESC

我喜欢xQbert的解决方案,但这完全取决于您试图实现的目标

你有这么好的连接设置…然后在select语句中加入以下内容:从TBL_RMA_SHIPPING中选择TBL_RMA_SHIPPING.SHIP_ADMIN_STATUS,其中TBL_RMA_SHIPPING.SHIP_RMAID=RMA_Inquiry.RMA_ID按TBL_RMA_SHIPPING.UPDATE_STATUS_DATE订购,将其更改为join并正确调用该字段……这将消除此错误和一系列混乱,可能也会加快速度。在select语句中按子查询排序没有任何逻辑意义。我猜这是SQL server,而不是mySQL,因为top和For XML被引用。如果要连接到表的是左连接而不是返回行,并且必须具有值,那么为什么需要在select中执行子查询?如果是,您确定您的联接在正确的列上吗?因此,您需要修改查询,使其根据该行的相关数据返回一个和一个记录/列。实际上,RMA_查询表包含可通过RMA_ID识别的所有查询信息,TBL_RMA_配送表包含RMA_查询表中配送状态为“1”的查询的配送详情。我正在更新查询状态待定、已发送、正在处理等。。。多次访问单个RMA_ID,并在我的查询中获取相同的状态。现在的问题是,我得到了多个RMA_ID的发货状态记录,但我只想要结果中的最新状态,而不是每个结果。实际上,RMA_查询表包含可通过RMA_ID识别的所有查询信息,TBL_RMA_配送表包含RMA_查询表中配送状态为“1”的查询的配送详情。我正在更新查询状态待定、已发送、正在处理等。。。多次访问单个RMA_ID,并在我的查询中获取相同的状态。现在的问题是,我正在获取RMA_ID的多个装运状态记录,但我只希望结果中的最新状态,而不是每个结果。无法绑定多部分标识符TBL_RMA_Shipping.SHIP_DETAILS。如果我运行查询,则会出现此错误。实际上,RMA_查询表包含有关查询的所有信息,这些信息可以通过RMA_ID识别,TBL_RMA_配送表包含RMA_查询表中配送状态为“1”的查询的配送详细信息。我正在更新查询状态待定、已发送、正在处理等。。。多次访问单个RMA_ID,并在我的查询中获取相同的状态。现在的问题是,我得到了多个RMA_ID的发货状态记录,但我只想要结果中的最新状态,而不是每个结果。我更新了以解决您的第一条评论。如果您只想要最新的记录,那么我将使用xQbert的解决方案,在帖子中的第二个查询
SELECT 
  RMA_ENQUIRY.RMA_ID,
   PART_NUMBER_TBL.PART_NO, 
   PART_SERIAL.SERIAL_NUM,
   RMA_ENQUIRY.RMA_TYPE,
   RMA_ENQUIRY.RMA_FAILURE_TYPE,
   RMA_ENQUIRY.RMA_COMPLAINT,
   RMA_ENQUIRY.RMA_ADDITIONAL_INFORMATION,
   RMA_ENQUIRY.RMA_REC_DATE,
   RMA_ENQUIRY.RMA_STATUS,
   RMA_ENQUIRY.RMA_SHIP_STATUS,
   (select [B].SHIP_ADMIN_STATUS from TBL_RMA_SHIPPING AS [B] where [B].SHIP_RMAID=[A].SHIP_RMAID) AS [SHIP_ADMIN_STATUS],
   RMA_ENQUIRY.[USER_ID],
   [A].SHIP_DETAILS
FROM RMA_ENQUIRY 
   LEFT JOIN PART_NUMBER_TBL 
              ON RMA_ENQUIRY.RMA_PART_NO=PART_NUMBER_TBL.PARTID 
   LEFT JOIN PART_SERIAL 
              ON RMA_ENQUIRY.RMA_SERIAL_NO=PART_SERIAL.SERIAL_ID
   LEFT JOIN TBL_RMA_SHIPPING AS [A] ON RMA_ENQUIRY.RMA_ID=[A].SHIP_RMAID
WHERE RMA_ENQUIRY.RMA_STATUS='A' AND RMA_ENQUIRY.RMA_SHIP_STATUS=1
ORDER BY RMA_ENQUIRY.RMA_REC_DATE DESC