передача значения в SQL

0

Я не уверен, что выбрал правильный заголовок, но я сделал все возможное, чтобы объяснить, что я пытаюсь сделать. Я просто узнаю о объединениях, и у меня есть две таблицы, которые я пытаюсь объединить определенным образом, но у них обоих есть предложения 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 и т.д.).

EDIT: эти данные запрашиваются с Impala и были созданы в MySQL, прежде чем импортироваться в HDFS с помощью HIVE.

EDIT2: Я должен также упомянуть, что в таблице "shipping_prices" уже есть поле в названии "zone". Поэтому я предполагаю, что не буду "передавать" его так же, как использовать его значение из вывода первого запроса, чтобы найти соответствующие кортежи в таблице "shipping_prices".

Любая помощь или советы будут оценены.

  • 2
    Вам следует добавить используемую СУБД, предпочтительно в качестве тега. Некоторые решения работают только для MySql, или SQL Server, или Oracle ...
  • 0
    Mysql уже поддерживает window functions в выпуске GA? или это Mysql 8.0, который является одним из разработчиков?
Показать ещё 6 комментариев
Теги:
join

1 ответ

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 (Development Release), Mysql Engine выполнит разумную оптимизацию запросов, которая, скорее всего, перепишет запросы IN и JOIN в тот же план. Проверьте этот URL для деталей. Преобразуйте IN в JOIN

Ещё вопросы

Сообщество Overcoder
Наверх
Меню