如何组合 sql 个查询,其中一个查询使用 MIN 函数

How to combine sql queries where one query uses the MIN function

我有一个只读的 firebird 数据库,我想从中提取数据。在 MS-Access 中,使用三个简单的查询非常容易获得我想要的数据,其中每个查询的输出是下一个查询的输入。现在我想在 PHP 中对此进行编程并将其保留在一行中 我想将这三个查询合并为一个,但我无法弄清楚。

第一个查询为我提供了公司计划中从今天开始的所有日期(最多 1000 行)。由于一些工作计划在更多的日子里进行,我只想要从今天开始的第一次约会。我通过在查询 2 中使用 MIN 函数获得此结果。在最后一个查询中,我使用左联接将所有待处理的作业与生成的第一个日期组合起来。

如何在一个查询中执行此操作?由于我只有阅读权限,因此无法使用临时表。

有人可以给我指路吗?

**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;

我有两个表,第一个称为 salesorder,其中包含我所有的工作。第二个称为 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

首先我应该说我没有使用 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;