从 table 中抓取一行
Grab one row from a table
我有一个视图和一个要从中获取数据的 table。我的视图具有基于订单号的基本订单信息。我从中获取数据的 table 具有基于订单号的非常详细的数据。当我 运行 视图本身时,我得到基本的订单 header 信息。当我查询 table 时,我得到 material 级详细信息的账单。我只需要将 table 中的一列数据添加到视图的结果集中。我目前有:
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
table 获取并连接 Shipment
数字,因为该列没有vw_OrderData
中不存在。
我得到的是 DetailData
table 中具有匹配 ORDER_NUMBER
的每一行。我很确定我没有正确加入,但我仍在学习 SQL。赞赏。
如果它给你多行,但只需要第一行,你可以使用 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 table 中具有匹配 ORDER_NUMBER 的每一行都太多了?您需要更具体的结果吗?
如果您只想抓取 1 行,那么您需要
SELECT top 1
x.ORDER_NUMBER, ...
请注意,这假设 any y.Shippment 条目都可以,但在您的数据中可能并非如此。
基本思路是LEFT JOIN
(因为你想保留第一个table中的所有行)。
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
(对于不匹配的记录)。这可能是可取的。有了它,您会得到带有连字符的订单号,连字符后什么也没有。
我尝试了以下操作:
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 table 中提取其他几行,所以我简单地添加了:
DetailData.OrderNumber+'-'+COALESCE(DetailData.Shippment,'00') as [Ship_Set]
作为视图结果集的一列,然后只需将该列添加到有问题的原始 select 语句中,而无需执行连接:
SELECT
ORDER_NUMBER,
Description,
Price,
Quantity,
[Ship_Set]
FROM
vw_OrderData
我有一个视图和一个要从中获取数据的 table。我的视图具有基于订单号的基本订单信息。我从中获取数据的 table 具有基于订单号的非常详细的数据。当我 运行 视图本身时,我得到基本的订单 header 信息。当我查询 table 时,我得到 material 级详细信息的账单。我只需要将 table 中的一列数据添加到视图的结果集中。我目前有:
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
table 获取并连接 Shipment
数字,因为该列没有vw_OrderData
中不存在。
我得到的是 DetailData
table 中具有匹配 ORDER_NUMBER
的每一行。我很确定我没有正确加入,但我仍在学习 SQL。赞赏。
如果它给你多行,但只需要第一行,你可以使用 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 table 中具有匹配 ORDER_NUMBER 的每一行都太多了?您需要更具体的结果吗?
如果您只想抓取 1 行,那么您需要
SELECT top 1
x.ORDER_NUMBER, ...
请注意,这假设 any y.Shippment 条目都可以,但在您的数据中可能并非如此。
基本思路是LEFT JOIN
(因为你想保留第一个table中的所有行)。
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
(对于不匹配的记录)。这可能是可取的。有了它,您会得到带有连字符的订单号,连字符后什么也没有。
我尝试了以下操作:
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 table 中提取其他几行,所以我简单地添加了:
DetailData.OrderNumber+'-'+COALESCE(DetailData.Shippment,'00') as [Ship_Set]
作为视图结果集的一列,然后只需将该列添加到有问题的原始 select 语句中,而无需执行连接:
SELECT
ORDER_NUMBER,
Description,
Price,
Quantity,
[Ship_Set]
FROM
vw_OrderData