我是SQL的新手,希望在理解下面的查询时提供一些帮助。我基本上想要了解查询实际上在做什么。如果有人可以带我了解这是做什么的,我认为这可能会帮助我解决问题。谢谢
SELECT V.NAME AS Vendor_name
,PO.ID AS PURC_ORDER_ID
,POL.LINE_NO
,POL.VENDOR_PART_ID
,PO.STATUS
FROM (
SELECT ID
,STATUS
,VENDOR_ID
FROM PURCHASE_ORDER
) PO
INNER JOIN Purc_order_line POL ON PO.ID = POL.PURC_ORDER_ID
INNER JOIN (
SELECT ID
,NAME
FROM vendor
) V ON PO.VENDOR_ID = V.ID
WHERE PO.ID = '16471'
答案 0 :(得分:0)
select V.Name as Vendor_name, PO.ID as PURC_ORDER_ID, POL.LINE_NO, POL.VENDOR_PART_ID, PO.STATUS
from (select ID, STATUS, VENDOR_ID from PURCHASE_ORDER) PO
inner join Purc_order_line POL
on PO.ID = POL.PURC_ORDER_ID
inner join (select ID, name from vendor) V
on PO.VENDOR_ID = V.ID
where PO.ID = '16471'
它做了一些对我来说很奇怪的事情,但让它走吧:奇怪的是与子查询/内联视图有关,它们不是必需的并且增加了读取的复杂性。它可以写成:
select V.Name as Vendor_name, PO.ID as PURC_ORDER_ID, POL.LINE_NO, POL.VENDOR_PART_ID, PO.STATUS
from PURCHASE_ORDER PO
inner join Purc_order_line POL
on PO.ID = POL.PURC_ORDER_ID
inner join vendor V
on PO.VENDOR_ID = V.ID
where PO.ID = '16471'
你会得到相同的结果。
从内到外读取SQL。所以首先要看最内层的条款。
WHERE PO.ID = '16471'
所以想一想。
如果订单有3行,每个订单有1个供应商,那么这将返回1 * 1 * 3个记录。 1为供应商* 1为采购订单* 3为行。
如果将where子句更改为不同的PO ID,则可能具有不同的行数。再次因为每个PO都有一个特定的供应商。每个PO可能有很多部分。因此,在这种情况下,返回的行数应与PO上的行数相匹配。
答案 1 :(得分:0)
这样做但更具可读性,因为它避免了子查询:
SELECT V.NAME AS Vendor_name,
PO.id AS PURC_ORDER_ID,
POL.line_no,
POL.vendor_part_id,
PO.status
FROM purchase_order PO
INNER JOIN purc_order_line POL
ON PO.id = POL.purc_order_id
INNER JOIN Vendor V
ON PO.vendor_id = V.id
WHERE PO.id = 16471
它从通过外键链接的不同表中选择列(f.e。PO.Vendor_id
) - >使用V.ID
的主键(f.e。INNER JOIN
)。这仅链接到现有记录,因此不包括未购买的供应商。 WHERE
按特定ID过滤结果集。