Sql 从桌子上抓一行

Sql 从桌子上抓一行,sql,sql-server,sql-server-2012,left-join,outer-join,Sql,Sql Server,Sql Server 2012,Left Join,Outer Join,我有一个视图和一个表,我正试图从中获取数据。我的视图具有基于订单号的基本订单信息。我从中获取数据的表中有基于订单号的非常详细的数据片段。当我单独运行视图时,我会得到基本的订单头信息。当我查询表时,我会得到物料清单级别的详细信息。我只需要将表中的一列数据添加到视图的结果集中。我目前有: SELECT x.ORDER_NUMBER, Description, Price, Quantity, x.ORDER_NUMBER + '-' + y.Shipm

我有一个视图和一个表,我正试图从中获取数据。我的视图具有基于订单号的基本订单信息。我从中获取数据的表中有基于订单号的非常详细的数据片段。当我单独运行视图时,我会得到基本的订单头信息。当我查询表时,我会得到物料清单级别的详细信息。我只需要将表中的一列数据添加到视图的结果集中。我目前有:

SELECT
    x.ORDER_NUMBER, 
    Description, 
    Price, 
    Quantity, 
    x.ORDER_NUMBER + '-' + y.Shipment AS [Ship_Set]
FROM 
    vw_OrderData AS x
JOIN
    DetailData AS y ON (x.ORDER_NUMBER = y.ORDER_NUMBER)
我正试图从
vw_OrderData
中获取结果集,然后从
DetailData
表中获取并连接
装运编号,因为该列在
vw_OrderData
中不存在


我得到的是
DetailData
表中具有匹配的
订单号的每一行。我相当肯定我没有正确加入,但我仍在学习SQL。非常感谢。

如果它提供多行,但只需要第一行,您可以使用
选择顶部(1)
选项,例如:

SELECT TOP(1)
x.ORDER_NUMBER, 
Description, 
Price, 
Quantity, 
x.ORDER_NUMBER+'-'+y.Shippment AS [Ship_Set]
FROM vw_OrderData AS x
join DetailData AS y
ON(x.ORDER_NUMBER = y.ORDER_NUMBER)

因此,您的查询的工作方式与描述的完全相同。你也许应该改进它,你到底需要什么?为什么DetailData表中具有匹配订单号的每一行都太多?您需要更具体的结果吗?

如果您只是想抓取一行,那么您需要

SELECT top 1
x.ORDER_NUMBER, ...

请注意,这假设任何y.Shipment条目都可以,但在您的数据中可能不是这样。

基本思想是左联接(因为您希望保留第一个表中的所有行)


请注意
COALESCE()
。如果没有
COALESCE()。这可能是可取的。使用它,您可以获得带有连字符的订单号,连字符后没有任何内容。

我尝试了以下操作:

SELECT o.ORDER_NUMBER, Description, Price, Quantity, 
   o.ORDER_NUMBER + '-' + COALESCE(dd.Shippment, '') AS [Ship_Set]
FROM vw_OrderData o LEFT JOIN
   DetailData dd
ON o.ORDER_NUMBER = dd.ORDER_NUMBER;
它返回相同数量的行,因为每个订单号有多个行项目。我没有尝试TOP 1解决方案,而是返回到我的OrderData视图,看到它已经从DetailData表中提取了另外两行,所以我只是添加了:

DetailData.OrderNumber+'-'+COALESCE(DetailData.Shippment,'00') as [Ship_Set]
作为视图结果集的一列,只需将该列添加到所讨论的原始select语句中,而无需执行联接:

SELECT
    ORDER_NUMBER, 
    Description, 
    Price, 
    Quantity, 
    [Ship_Set]
FROM 
    vw_OrderData

我们需要知道您使用的是什么数据库引擎。答案将根据这一点而有所不同。我在SQL2012上运行此操作,您的查询有什么问题?我认为问题在于,对于相同的订单号,他在表中有多行,因此在视图中得到多个结果,他希望只得到一条记录,只是关于表别名的一个小提示,我在orderdata中有o,在detaildata中有d。比x和y更容易记住,在编写查询时更好,也更适合其他人阅读您的代码。
SELECT
    ORDER_NUMBER, 
    Description, 
    Price, 
    Quantity, 
    [Ship_Set]
FROM 
    vw_OrderData