从表中抓一行

时间:2016-02-01 15:17:57

标签: sql sql-server sql-server-2012 left-join outer-join

我有一个视图和一张表,我试图从中获取数据。我的观点包含基于订单号的基本订单信息。我从中获取数据的表格具有基于订单号的非常详细的数据。当我单独运行视图时,我会获得基本的订单标题信息。当我查询表格时,我会获得物料清单详细信息。我只需要表中的一列数据,就可以添加到视图的结果集中。我目前有:

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获取结果集,然后从Shipment表中获取并连接DetailData数字,因为该列不存在在vw_OrderData

我得到的是DetailData表格中匹配ORDER_NUMBER的每一行。我相当肯定我没有正确加入,但我还在学习SQL。赞赏。

4 个答案:

答案 0 :(得分:1)

如果它为您提供了多行,但只需要第一行,则可以使用SELECT TOP(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表中具有匹配ORDER_NUMBER的每一行都太多了?你需要更具体的结果吗?

答案 1 :(得分:1)

基本思路是LEFT JOIN(因为您希望将所有行保留在第一个表中)。

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;

注意COALESCE()。如果没有COALESCE()Ship_Set将是NULL非匹配记录。这可能是可取的。有了它,您可以使用连字符获得订单号,并且在连字符后面没有任何内容。

答案 2 :(得分:0)

如果你只是想抓住1排,那么你想要

SELECT top 1
x.ORDER_NUMBER, ...

请注意,这假设任何 y.Shippment条目都可以,您的数据可能不是这种情况。

答案 3 :(得分:0)

我尝试了以下内容:

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