Как объединить SQL-запросы, где один запрос использует функцию MIN
У меня есть база данных Firebird только для чтения, из которой я хочу извлечь данные. В MS-Access очень легко получить нужные данные, используя три простых запроса, в которых вывод каждого запроса является вводом следующего. Теперь я хочу запрограммировать это на PHP и держать его в одной строке. Я хочу объединить эти три запроса в один, но я не могу понять это.
Первый запрос дает мне все даты, начиная с сегодняшнего дня, которые находятся в планировании моей компании (максимум 1000 строк). Так как некоторые работы запланированы на большее количество дней, я хочу только первое свидание с сегодняшнего дня. Я получаю это с помощью функции MIN в запросе 2. В последнем запросе я использую левое соединение, чтобы объединить все мои ожидающие работы с сгенерированными первыми датами.
Как я могу сделать это в одном запросе? Поскольку у меня есть только права на чтение, я не могу работать с временными таблицами.
Может кто-нибудь дать мне несколько указаний, пожалуйста?
**First step**
SELECT
salesorderplan.plandate,
salesorderplan.salesorder
FROM
salesorderplan
WHERE
salesorderplan.plandate >= Date();
**second step**
SELECT
Min([1estap].plandate) AS firstplandate, [1estap].salesorder
FROM
[1estap]
GROUP BY
[1estap].salesorder;
**third step**
SELECT
salesorder.orderno,
[2estap].firstplandate,
salesorder.description,
salesorder.deliverylocname,
salesorder.deliveryaddress,
salesorder.deliverycity
FROM
((salesorder)
left join 2estap on (salesorder.objectid = [2estap].salesorder))
WHERE
salesorder.salesstatus=1
ORDER BY
salesorder.orderno;
У меня есть две таблицы, первая называется продавец, который содержит все мои работы. Второй называется salesorderplan, который содержит все даты в моем планировании с указанием рабочих мест.
SALESORDER
objectid description etc
342567 blah blah
356782 jwz
384512 not in planning yet
SALESORDERPLAN
objectid salesorder plandate
23451 342567 12-03-2017
23489 342567 14-04-2017
23490 356782 13-03-2017
23496 356782 18-06-2017
23499 342567 21-08-2017
23499 342567 28-08-2017
23512 356782 30-08-2017
23524 356782 2-09-2017
Я хочу список всех моих заказов. Если в моем планировании есть дата, я хочу первую дату после сегодняшнего дня (именно там я и использовал функцию MIN), поэтому результат должен быть
Result
objectid description plandate
342567 blah blah 21-08-2017
356782 jwz 30-08-2017
384512 not in planning yet no date
1 ответ
Я должен предварять это, говоря, что у меня нет опыта работы с Firebird, но у меня есть опыт работы с SQL. Это может работать для вас:
-- **third step**
SELECT
salesorder.orderno,
[2estap].firstplandate,
salesorder.description,
salesorder.deliverylocname,
salesorder.deliveryaddress,
salesorder.deliverycity,
FROM salesOrder LEFT JOIN (
-- **second step**
SELECT
Min([1estap].plandate) AS firstplandate, [1estap].salesorder
FROM (
-- **First step**
SELECT
salesorderplan.plandate,
salesorderplan.salesorder
FROM
salesorderplan
WHERE
salesorderplan.plandate >= Date()
) [1estap]
GROUP BY
[1estap].salesorder
) [2estap] ON (salesorder.objectid = [2estap].salesorder))
WHERE
salesorder.salesstatus=1
ORDER BY
salesorder.orderno;
РЕДАКТИРОВАТЬ
Как отмечает @MarkRotteveel, ваши первые два запроса могут быть объединены в один. Вот запрос с этим выполненным:
-- **third step**
SELECT
salesorder.orderno,
[2estap].firstplandate,
salesorder.description,
salesorder.deliverylocname,
salesorder.deliveryaddress,
salesorder.deliverycity,
FROM salesOrder LEFT JOIN (
-- **first & second steps**
SELECT
Min(plandate) AS firstplandate, salesorder
FROM salesorderplan
WHERE
plandate >= Date()
GROUP BY
salesorder
) [2estap] ON (salesorder.objectid = [2estap].salesorder))
WHERE
salesorder.salesstatus=1
ORDER BY
salesorder.orderno;