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 считывается наизнанку. Поэтому сначала взгляните на внутреннюю часть из предложения.
- Он генерирует встроенный просмотр поставщика и вызывает его (псевдоним) 'V', содержащий идентификатор и имя.
- Это генерируя вложенное представление на purchase_order и используя псевдоним «PO», содержащий поля ID, статус, VENDOR_ID
- Это присоединение Purchase_order_line, Vendor и purchase_order вместе с помощью внутренних соединений. Это приведет к набору результатов, который содержит все заказы на поставку, строки в заказах и имя поставщика, с которого был размещен заказ.
- Затем он ограничивает результаты только конкретного заказа на поставку с использованием линии
WHERE PO.ID = '16471'
- Наконец он возвращается в виде столбцов в наборе результатов: имя поставщика, 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.
Что вы не понимаете? Он выбирает некоторые столбцы из некоторых таблиц, которые связаны через foreignkey -> primarykey и фильтруют по идентификатору. –
Если вы только начинаете изучать SQL, может возникнуть смысл начать с более простых запросов к образцу. – Pointy
Чтобы быть справедливым, эти подзапросы немного спамны и делают его более грязным, чем нужно. –