我正在从ODBC源中检索多行到listview控件中。对于简单的SELECT,它似乎适用于SQL_SCROLLABLE的语句属性。如何使用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查询获得相同的结果?
LATE EDIT:联合查询的问题在于它实际上仅强制转发滚动,这会破坏SQLFetchScroll(hstmt1Fetch,SQL_FETCH_ABSOLUTE,Position)。答案是我怀疑:“你不能”。它实际上意味着重新设计数据库以包含视图或单个表来替换UNION。但是如果我错过了什么,我会把问题留待。
答案 0 :(得分:1)
你能不能在db服务器上定义一个为你做联合查询的视图,所以从客户端代码看它只是一个选择?
如果你不能,你可以在你的选择中发出联合操作,例如
select some_fields from table1
union
select same_fields from table2
并将结果视为单个结果集?
答案 1 :(得分:0)
如果问题只是需要获取最后一行来获取行数并缓存最后几行(我假设如果选择中有一百万个项目,那么您没有填充所有行的下拉列表其中你可以利用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
只需获取您需要显示/缓存的行
但严重的是,如果您从百万行表中选择项目,您可能需要考虑不同的机制
祝你好运!答案 2 :(得分:0)
您是否尝试过使用union
制作派生表?
select * from
(select field1, field from table1
union all
slect field1, filed2 from table2) a