使用UNION查询从ODBC源中检索多行
我正在从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