使用UNION查询从ODBC源中检索多行

时间:2020-03-06 14:24:37  来源:igfitidea点击:

我正在从ODBC源将多个行检索到listview控件中。对于简单的SELECT,它似乎可以与SQL_SCROLLABLE的statement属性一起使用。如何使用UNION查询(有两个选择)执行此操作?

最可能的服务器将是MS SQL Server(可能是2005)。该代码是Win32 API的C语言。

此代码设置(我认为是)服务器端游标,该游标将数据馈送到ODBC驱动程序中,该驱动程序与SQLFetchScroll的位置提取大致相对应,而SQLFetchScroll的位置获取又将其馈入listview的缓存。 (有时也使用SQL_FETCH_FIRST或者SQL_FETCH_LAST):

SQLSetStmtAttr(hstmt1Fetch,
               SQL_ATTR_CURSOR_SCROLLABLE,
               (SQLPOINTER)SQL_SCROLLABLE,
               SQL_IS_INTEGER);
SQLSetStmtAttr(hstmt1Fetch,
               SQL_ATTR_CURSOR_SENSITIVITY,
               (SQLPOINTER)SQL_INSENSITIVE,
               SQL_IS_INTEGER);
...
retcode = SQLGetStmtAttr(hstmt1Fetch,
                         SQL_ATTR_ROW_NUMBER,
                         &CurrentRowNumber,
                         SQL_IS_UINTEGER,
                         NULL);
...
retcode = SQLFetchScroll(hstmt1Fetch, SQL_FETCH_ABSOLUTE, Position);

(以上是单个SELECT的工作代码片段)。

这是最好的方法吗?鉴于我需要检索最后一行以获取行数并填充结束缓冲区,是否有更好的方法呢? (我可以只使用向前滚动吗?)

假设以上是,我如何通过UNION查询获得相同的结果?

最新编辑:联合查询的问题在于,它有效地强制仅向前滚动,这会中断SQLFetchScroll(hstmt1Fetch,SQL_FETCH_ABSOLUTE,Position)。答案是我怀疑:"你做不到"。这实际上意味着要重新设计数据库,使其包含视图或者单个表来替换UNION。但是,如果我错过了一些东西,我将保留这个问题。

解决方案

我们能否在db服务器上定义为我们查询并查询的视图,所以从客户端代码来看,它看起来就像是一次选择?

如果不能,我们是否可以将合并操作作为选择的一部分进行发布,例如

select some_fields from table1
union
select same_fields from table2

并将结果视为单个结果集?

如果问题仅是需要获取最后一行以获取行数并缓存最后几行(我认为如果选择中有一百万个项目,那么我们不会用所有这些填充列表)那么我们也许可以利用SQL Server 2005的ROW_NUMBER()函数

你可以:

select count(*) 
from (select blah UNION select blah)

获取行数。

然后:

select ROW_NUMBER() as rownum,blah 
from (select blah UNION select blah) 
where rownum between minrow and maxrow

只获取需要显示/缓存的行

但是认真的人,如果我们要从一百万行的表中选择项目,则可能需要考虑其他机制

祝你好运!

我们是否尝试过使用" union"制作派生表?

select * from 
(select field1, field from table1
union all
slect field1, filed2 from table2) a