Eu tenho a seguinte consulta SQL Server
select
(select top 1 b2 from BB b where b.b1 = a.a1 order by b2) calc,
a1,
a2
from AA a
where a2 = 2;
que posso reescrever usando funções analíticas
select
(select b2 from
(select
row_number() over (order by b2) lfd,
b2 from BB b where b.b1 = a.a1
) as t where lfd = 1
) calc,
a1,
a2
from AA a
where a2 = 2;
mas quando eu converto isso para oracle
create table AA ( a1 NUMBER(10), a2 NUMBER(10) );
insert into AA values ( 1, 1);
insert into AA values ( 1, 2);
insert into AA values ( 1, 3);
insert into AA values ( 2, 2);
create table BB ( b1 NUMBER(10), b2 NUMBER(10) );
insert into BB values ( 1, 1);
insert into BB values ( 2, 4);
insert into BB values ( 2, 5);
select * from AA;
select * from BB;
select
(select b2 from
(select
row_number() over (order by b2) lfd,
b2 from BB b where b.b1 = a.a1
) where lfd = 1
) calc,
a1,
a2
from AA a
where a2 = 2;
Estou tendo o erro a seguir
Error at line 5
ORA-00904: "A"."A1": invalid column name
você executaria a junção primeiro no Oracle:
O problema com sua consulta é que atualmente uma subconsulta no Oracle não pode acessar um valor de uma consulta pai com mais de dois níveis de profundidade.
Você também pode usar uma função PL/SQL que contenha o SELECT interno.
Se estes são os resultados que você está procurando:
Você pode obtê-lo com isso:
Aqui vou mostrar alguns resultados que obtive ao usar a abordagem de Vincent Malgrat.
Primeiro, aprendi que, ao usar mais de 1 subconsulta top 1 com base em tabelas ou pedidos diferentes, devo usar a função RANK () e não a função ROW_NUMBER () .
Em segundo lugar, ao usar rank (), há o problema de empates. O top 1 do SQL Server seleciona arbitrariamente uma das linhas com classificação = 1, enquanto o uso de classificação () pode retornar mais de 1 linha.
Eu acho que é um design ruim usar o SQL Server top 1 nesses casos. Para tornar o design correto, algumas restrições exclusivas (por exemplo, índices exclusivos) devem ser encontradas, o que evita essa ambigüidade.
Aqui está um exemplo do SQL Server, se você quiser experimentá-lo sozinho.
A comparação dos planos de execução das duas últimas instruções select abaixo mostra que a abordagem de Vincent Malgrat é melhor do que a primeira solução.
Resposta para Leigh Riffel:
Nas linhas seguintes com id 1 e 2, ambos têm rank () e densa_rank de 1.
Resultado:
Nova resposta para Leigh Riffel:
Aqui um exemplo, não consigo transformar com seu padrão. Tenho uma tabela com artigos e preços e uma segunda tabela com o histórico de variações de preços. Alguma autoridade quer saber o preço antigo, quando o preço mudou.
eu quero pegar
mas a segunda dá
A abordagem de Vincent Malgrat produz o resultado correto