>

올바른 제목을 고르지 못했지만 최선을 다해 내가하려는 일을 설명했습니다. 조인에 대해서만 배우고 있으며 특정 방식으로 결합하려고하는 두 개의 테이블이 있지만 둘 다 WHERE 절이 있습니다.

두 SELECT 문을 따로 작성하여 시작했습니다. 다음은 표에서 첫 번째 것입니다 : "shipping_zones"

SELECT MIN(cal_zone) AS output_zone
  FROM (
    SELECT carrier, dest_zip, origin_zip, zone, MIN(zone) OVER(PARTITION BY carrier) as cal_zone
      FROM shipping_zones z
        WHERE (origin_zip = 402 OR origin_zip = 950) AND dest_zip = 015
      ) as t
WHERE zone=cal_zone;

이것은 다음을 반환합니다 :

+-------------+
| output_zone |
+-------------+
| 5           |
+-------------+

두 번째 표는 "shipping_prices"이고 내 쿼리는 :

SELECT carrier, speed, zone, min_price
FROM (SELECT carrier, zone, speed, price, MIN(price) OVER(PARTITION BY speed) as min_price
      FROM shipping_prices
      WHERE total_wt = 66 and zone = 6
     ) t
WHERE price=min_price
ORDER BY speed DESC;

결과는 :

+---------+-------+------+-----------+
| carrier | speed | zone | min_price |
+---------+-------+------+-----------+
| fedex   | slow  | 6    | 45.66     |
| usps    | med   | 6    | 96.05     |
| usps    | fast  | 6    | 347.15    |
+---------+-------+------+-----------+

내가하고 싶은 것은 첫 번째 쿼리에서output_zone의 값을 두 번째 쿼리에 "인수"로 "전달"하는 것입니다. 나는 그것이 정확한 단어인지 확실하지 않기 때문에 따옴표 안에 인용 단어를 넣습니다.

SQL에서 이것을 달성하는 가장 좋은 것은 조인을 올바르게 사용하는 것입니까? 조인의 기본 구문을 이해하지만 둘 다 (WHERE, MIN, ORDER BY 등)에서 사용하는 절 때문에 약간 손실되었습니다.

편집 :이 데이터는 Impala로 쿼리되며 HIVE를 사용하여 HDFS로 가져 오기 전에 MySQL에서 생성되었습니다.

EDIT2 : "shipping_prices"테이블에는 이미 "zone"이라는 필드가 있습니다. 따라서 "shipping_prices"테이블에서 적절한 튜플을 찾기 위해 첫 번째 쿼리 출력의 값을 사용하는 것만 큼 많이 "전달하지"않았을 것입니다.

도움이나 팁을 주시면 감사하겠습니다.

  • 답변 # 1

    단순히 하나의 zone in (first_query) 에 첫 번째 쿼리를 넣을 수 있습니다   zone=6 를 대체 할 진술 .

    코드는 다음과 같습니다.

    SELECT carrier, speed, zone, min_price
    FROM (SELECT carrier, zone, speed, price, MIN(price) OVER(PARTITION BY speed) as min_price
          FROM shipping_prices
          WHERE total_wt = 66 
          and zone in (
            SELECT MIN(cal_zone) AS output_zone
              FROM (
                SELECT carrier, dest_zip, origin_zip, zone, MIN(zone) OVER(PARTITION BY carrier) as cal_zone
                  FROM shipping_zones z
                    WHERE (origin_zip = 402 OR origin_zip = 950) AND dest_zip = 015
                  ) as t
            WHERE zone=cal_zone;
          )
         ) t
    WHERE price=min_price
    ORDER BY speed DESC;
    
    

    Mysql 8.0 (개발 릴리스)을 사용하는 것 같습니다. Mysql 엔진은INJOIN쿼리를 모두 같은 것으로 다시 작성하는 합리적인 쿼리 최적화를 수행합니다. 계획. 자세한 내용은이 URL을 확인하십시오. IN을 JOIN으로 변환

  • 이전 server - Microsoft Azure App Services에서 DLL 실행
  • 다음 javascript - 조건 문의 Fullpagejs 호출 함수