我有一个只读的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
答案 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;