Eu li o código a seguir algumas vezes tentando descobrir o que ele está fazendo.
"Uma junção externa direita é aquela que retorna as linhas não correspondentes das tabelas da direita com as linhas correspondentes da tabela da esquerda."
Ok, mas a coluna "item_cnt"
não existe nas tabelas, então qual coluna ela está servindo como alias? Estou me preparando para 1z0-047, então qualquer ajuda seria apreciada.
Você executou a seguinte consulta para exibir PRODUCT_NAME
e o número de vezes que o produto foi solicitado:
SELECT p.product_name, i.item_cnt
FROM (SELECT product_id, COUNT (*) item_cnt
FROM order_items
GROUP BY product_id) i RIGHT OUTER JOIN products p ON i.product_id = p.product_id;
Achei que a coluna deveria existir. Mas aqui está a página de documentos do Oracle com todos os esquemas de exemplo. Se eu procurar com ctrl+f por item_cnt
, não encontro nada: Oracle example schemas .
A coluna
item_cnt
pode não existir nas tabelas base (acreditamos em você, não pesquisamos os documentos vinculados).Mas esta parte do código:
fornece uma tabela derivada . A coluna existe durante o tempo em que a consulta é executada, na tabela derivada
i
. O(SELECT product_id, ... item_cnt ...) AS i
define uma tabela derivada, nomeia-ai
e esta tabela derivada tem duas colunasproduct_id
eitem_cnt
(eitem_cnt
é um alias para a expressãoCOUNT(*)
. Não há coluna count(*) em nenhuma das tabelas!)Então, mais tarde no código, você pode usá-los. O
i.product_id
é usado naON
condição ei.item_cnt
naSELECT
lista.(E é um pouco confuso que pareça aparecer antes e não depois. Isso ocorre porque a
SELECT
parte de uma consulta é executada logicamente após aFROM
parte.)Para a execução da consulta, as duas tabelas (aliased
i
ep
) não possuem diferença. Não importa que uma seja uma tabela base e a outra uma tabela derivada . Eles podem ser usados da mesma maneira. (e até onde sabemos,products
pode não ser uma tabela base também. Pode muito bem ser uma tabela visualizada , geralmente chamada de visualização .)