了解SQL查询初学者

时间:2014-12-11 14:41:20

标签: sql-server

我是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'

2 个答案:

答案 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。所以首先要看最内层的条款。

  1. 它会在供应商处生成内联视图并将其调用(别名)' V'包含ID和名称。
  2. 它在Purchase_Order上生成内联视图并使用别名' PO'包含字段ID,status,vendor_Id
  3. 它使用内部联接一起加入Purchase_order_line,Vendor和Purchase_order。这将产生一个结果集,其中包含所有采购订单,订单上的行以及下订单的供应商名称。
  4. 然后,它仅使用行WHERE PO.ID = '16471'
  5. 将结果限制为特定的采购订单
  6. 最后,它返回结果集中的列:供应商名称,PO.ID,行号,vendor_part_ID和PO的状态。该查询为一些列名称添加了别名,以使其更易于理解。 PO.ID被重新标记为Purch_order_Id,而V.Name被称为Vendor_Name。这通常是为了防止对未来读者的数据产生混淆。
  7. 所以想一想。

    如果订单有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过滤结果集。