Как объединить 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;
Другие вопросы по тегам