Foxpro 复杂子查询
Posted
技术标签:
【中文标题】Foxpro 复杂子查询【英文标题】:Foxpro complex sub query 【发布时间】:2013-09-05 22:35:23 【问题描述】:我很难在 foxpro 2.6 中进行查询(别无选择)
由于某种原因联合查询不起作用。
stockw (item, qte, dat) item is key
shist (item, qte, date) each row is a purchase for item and qte and date
以下查询将计算 shist 中某件商品的首次购买量,以了解自年初以来我们已售出每件商品的月份数
select shist.item as s_item, MIN(shist.date),stockw.qte as qte_remain,;
IIF( YEAR(MIN(shist.date)) < 2013, MONTH(DATE()), MONTH(DATE())-MONTH(shist.date)+1 ) as months;
FROM shist,stockw;
WHERE (shist.item LIKE 'LF-TK%' OR shist.item LIKE 'PL%' OR shist.item LIKE 'LF-A%') AND stockw.item = shist.item;
GROUP BY shist.item;
into CURSOR x
我想: - 计算每个项目从2013年初到现在的平均qte SUM(shist.qte)/months(每个项目的月份是从上面的查询中计算出来的)
也许在不同的查询中我想要以下内容: - 从 2013 年初到现在,为每个项目(获取最高月份)选择每个月 shist.qte 总和的最大值。
【问题讨论】:
UNION 不能工作仅仅是因为它在 Visual FoxPro 3.0 之前不受支持 不是这样。刚刚仔细检查,UNION 在 FoxPro 2.x 中。 【参考方案1】:由于我不太了解您将在哪里应用联合,并且您似乎多次运行查询,所以这是一个非常古老的技巧,在 VFP 的旧时代可以使用...
当您选择进入游标时,游标通常是只读的,而不是读写追加到...但是,如果您使用第一次运行查询的结果再次作为不同的别名,您可以附加到它。类似的东西......
use in select( "C_ThisIsMaster" )
for i = 1 to 10
use in select( "C_ThisRun" )
select blah, blah2, blah3 ;
from YourTables;
where SomeKey = SomeIDForCyclei;
into cursor C_ThisRun
if not used( "C_ThisIsMaster" )
select 0
use ( dbf( "C_ThisRun") ) again alias C_ThisIsMaster
else
select C_ThisIsMaster
append from dbf( "C_ThisRun" )
endif
endfor
for[i] 循环只是一个示例,但如果您要运行多个循环,而您会为其执行 UNION,您可以将其拉入查询并模拟相同的查询,例如通过
select *
from SomeTable
where SomeCondition
into cursor C_DoTheseItems
use in select( "C_ThisIsMaster" )
select C_DoTheseItems
do while not eof()
Do the same thing as inside the FOR loop above
select C_DoTheseItems
skip
enddo
我知道 VFP 有 scan/endscan,但不记得它起源于多远,所以在这里使用 do while NOT eof()...
在任一选项结束时,都会为您尝试处理的每个项目提供一个模拟 UNION,以便处理成一个“别名”结果“C_ThisIsMaster”
【讨论】:
我最终创建了多个查询,但由于我不知道如何将输出用作表来运行新查询,所以我创建了一个临时表,在此表上运行新查询,然后删除它 SCAN/ENDSCAN 回到 FoxPro 2.0。 @TamarE.Granor,我是这么认为的,但不想因为其他方式仍然有帮助而放弃他们以上是关于Foxpro 复杂子查询的主要内容,如果未能解决你的问题,请参考以下文章