如何在一个查询使用MIN函数的情况下组合sql查询

时间:2017-08-18 20:45:19

标签: sql firebird

我有一个只读的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 fuct的地方) 所以结果应该是

Result
objectid description             plandate
342567   blah blah               21-08-2017
356782   jwz                     30-08-2017
384512   not in planning yet     no date

1 个答案:

答案 0 :(得分:2)

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