2014-12-11 3 views
-1

Я очень новичок в SQL и хотел бы помочь в понимании приведенного ниже запроса. Я в основном хочу понять, что делает запрос. Если кто-то может принять меня за то, что это делает, я думаю, что это может помочь мне собрать кучу. СпасибоПонимание SQL Query Beginner

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

Что вы не понимаете? Он выбирает некоторые столбцы из некоторых таблиц, которые связаны через foreignkey -> primarykey и фильтруют по идентификатору. –

+1

Если вы только начинаете изучать SQL, может возникнуть смысл начать с более простых запросов к образцу. – Pointy

+2

Чтобы быть справедливым, эти подзапросы немного спамны и делают его более грязным, чем нужно. –

ответ

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', содержащий идентификатор и имя.
  2. Это генерируя вложенное представление на purchase_order и используя псевдоним «PO», содержащий поля ID, статус, VENDOR_ID
  3. Это присоединение Purchase_order_line, Vendor и purchase_order вместе с помощью внутренних соединений. Это приведет к набору результатов, который содержит все заказы на поставку, строки в заказах и имя поставщика, с которого был размещен заказ.
  4. Затем он ограничивает результаты только конкретного заказа на поставку с использованием линии WHERE PO.ID = '16471'
  5. Наконец он возвращается в виде столбцов в наборе результатов: имя поставщика, PO.ID, номера строк, vendor_part_IDs и статус ПО. Запрос имеет псевдоним некоторых имен столбцов, чтобы сделать их более понятными. PO.ID передается как Buy_order_Id, а V.Name называется Vendor_Name. Это часто делается для предотвращения путаницы в отношении того, что данные для будущих читателей.

Так что подумайте об этом так.

Если у заказа есть 3 строки, у каждого заказа есть 1 продавец, тогда это вернет 1 * 1 * 3 записи. 1 для поставщика * 1 для заказа на поставку * 3 для линий.

Если вы измените предложение where на другой идентификатор PO, у вас может быть разное количество строк. опять же потому, что у каждого ПО есть определенный поставщик. И у каждого ПО может быть много частей на нем. Поэтому в этом случае количество возвращаемых строк должно совпадать с количеством строк в PO.

+0

Благодарим вас за это время и детали, это действительно помогает мне лучше понять, что происходит. – Gabe

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 

вставили столбцы из разных таблиц, связанных с помощью внешних клавиш (Fe PO.Vendor_id) -> Primary-клавиш (к V.ID) с использованием INNER JOIN. Это связано только с существующими записями, поэтому поставщики, которые не были куплены, не включены. WHERE фильтрует набор результатов по определенному идентификатору.

+0

Спасибо, что сломался, я очень ценю ваше время. Это тоже помогает. – Gabe