programing

FROM 절에서 하위 쿼리를 사용하여 MariaDB 쿼리를 최적화하려면 어떻게 해야 합니까?

iphone6s 2023. 10. 19. 22:05
반응형

FROM 절에서 하위 쿼리를 사용하여 MariaDB 쿼리를 최적화하려면 어떻게 해야 합니까?

이 두 테이블을 상상해 보세요.

표 A

ID col1 col2 col3
1  foo  baz  bar
2  ofo  zba  rba
3  oof  abz  abr

표 B

A_ID field_name field_value
1    first      Jon
1    last       Doe
2    first      Adam
2    last       Smith

등..

이제 쿼리를 가지고 싶습니다(현재의 쿼리는 이렇게 표시됨).

SELECT 
    a.id, 
    a.col1, 
    a.col2, 
    (SELECT field_value FROM B WHERE A_ID = a.id AND field_name = 'first') as first_name, 
    (SELECT field_value FROM B WHERE A_ID = a.id AND field_name = 'last') as last_name
FROM A a
WHERE (SELECT COUNT(*) FROM B WHERE A_ID = a.id) = 2;

이 쿼리는 작동 중입니다.제가 이루고 싶은 것은 이런 것이 될 것입니다.

SELECT 
  a.id,
  a.col1,
  a.col2,
  (SELECT field_value FROM b WHERE b.field_name = 'first') as first_name,
  (SELECT field_value FROM b WHERE b.field_name = 'last') as last_name
FROM
  A a,
  (SELECT field_value, field_name FROM B WHERE A_ID = a.id) b
WHERE (SELECT COUNT(*) FROM b) = 2;

제 접근 방식은 어떻게 정확하게 보일까요?B 테이블의 여러 질의를 제거할 수 있는 다른 방법은 없습니까?

감사해요!

상관 관계가 있는 하위 쿼리를 조인으로 대체합니다.

SELECT 
    a.id, 
    a.col1, 
    a.col2,
    b1.field_value AS fv1,
    b2.field_value AS fv2
FROM A a
LEFT JOIN B b1
    ON a.id = b1.A_ID AND b1.field_name = 'first'
LEFT JOIN B b2
    ON a.id = b2.A_ID AND b2.field_name = 'last';

이 대답은 주어진 A 레코드의 왼쪽 조인이 B 테이블의 최대 하나의 레코드와 일치한다고 가정합니다. 그러나 상관된 하위 쿼리가 단일 값만 반환하는 데는 어쨌든 요구 사항입니다.

언급URL : https://stackoverflow.com/questions/57324589/how-do-i-optimize-mariadb-query-with-subqueries-in-from-clause

반응형