Должен ли max (field1) в пределах max (field2) использовать внутреннее соединение? - PullRequest
0 голосов
/ 05 октября 2018

Я хочу найти максимальное значение поля (tradeId, но приведено как Long) в пределах максимального значения другого поля (отметка времени).

У меня есть следующий HQL-запрос, который работает нормально и быстро, но мне интересно, если объединение таблицы с самим собой - это действительно самый элегантный способ достижения этого?EXPLAIN говорит мне, что «выбор таблиц оптимизирован», так что может и нет?

@Query("select max(cast(t1.tradeId as long)) from TradeDbo t1 inner join TradeDbo t2 on t1.id = t2.id"
       +" where t2.timestamp = (select max(timestamp) from TradeDbo where currencyPair.id = :currencyPairId)")

Класс TradeDbo:

public class TradeDbo extends Auditable<String> {
  @Id @GeneratedValue   
  @Getter private Long id;

  @JoinColumn(name = "currency_pair_id")
  @ManyToOne(fetch=FetchType.EAGER) 
  @Getter private CurrencyPairDbo currencyPair;

  @Column(name = "timestamp")
  @Convert(converter = DateConverter.class)
  @Getter private Date timestamp;

  @Column(name = "trade_id")
  @Getter private String tradeId;
  ...

SQL, сгенерированный HQL:

select max(cast(tradedbo0_.trade_id as signed)) as col_0_0_ from trade tradedbo0_ 
inner join trade tradedbo1_ on (tradedbo0_.id=tradedbo1_.id) 
where tradedbo1_.timestamp=(select max(tradedbo2_.timestamp) 
from trade tradedbo2_ where tradedbo2_.currency_pair_id=21185903) 

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете избежать повторного объединения на одном столе

select max(cast(trade_id as signed)) as col_0_0_ 
from trade 
INNER JOIN (
    select max(timestamp)  max_value
    from tradewhere currency_pair_id=21185903
) t on t.max_value = trade.timestamp
...