如何组合 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;
我有一个只读的 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;