工作中经常碰到主表和子表这样的设计,它们的关系是1对多。好多页面上显示的是主表上面的数据,可要求按照字表的某一字段进行查询。
这种场景一般有二种解决方法
CREATE FUNCTION [dbo].[f_str_singlename](@id varchar(50))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + ItemName
FROM Market_ManageContractSub
WHERE ContractId=@id
RETURN STUFF(@r, 1, 1, '')
END
第二、以子表为主关联主表建视图,查询时同一主表记录只取一条。
最近碰到一个设计的时候不是用的子表保存记录,而是用XML的形式保存在主表一个字段里面,
这种情况下就不能用上面的方法按子表的字段进行查询。只能取出全部数据,再对数据进行过滤。由于过滤后页面上要进行分页。以前的拼SQL进行分页啊的不能用了。
只能对过滤后的数据再进行分页。在网上找到一个方法,将复制行的地方改了下,修改后代码如下:
public DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)
{
if (PageIndex == 0)
return dt;
DataTable newdt = dt.Clone();
//newdt.Clear();
int rowbegin = (PageIndex - 1) * PageSize;
int rowend = PageIndex * PageSize;
if (rowbegin >= dt.Rows.Count)
return newdt;
if (rowend > dt.Rows.Count)
rowend = dt.Rows.Count;
for (int i = rowbegin; i <= rowend - 1; i++)
{
//DataRow newdr = newdt.NewRow();
//DataRow dr = dt.Rows[i];
//foreach (DataColumn column in dt.Columns)
//{
// newdr[column.ColumnName] = dr[column.ColumnName];
//}
//newdt.Rows.Add(newdr);
newdt.ImportRow(dt.Rows[i]);
}
return newdt;
}