美文网首页
联合主键,及视图子表null值问题

联合主键,及视图子表null值问题

作者: wwmin_ | 来源:发表于2017-03-15 13:15 被阅读106次

子表为空,但子表的FID不为null,导致根据主表字段查出来的值也为null
解决方法:添加联合主键 (在view视图类型中经常用到) 和 将子表主键默认设置为-1
将下面代码

public ProjectDetailViewMap()
 {
      this.ToTable("Sys_ProjectDetailView");
      this.HasKey(t => t.F_Id );
}

改为:

public ProjectDetailViewMap()
{
       this.ToTable("Sys_ProjectDetailView");
       this.HasKey(t => new { t.F_Id,t.project_id});
}

在sql中添加的视图,如果子表的FID不允许为null时,创建视图根据主表左连会导致子表的FID为null,违背了子表的建表逻辑.
当进行查询时,查出来的子表为空时则ProjectDetailViewEntity记录为null

public List<ProjectDetailViewEntity> SearchSumByYear(int year)
{
      return detailviewService.IQueryable().Where(p => p.F_ProjectYear == year).ToList();
}

在sql中修改创建的视图view,将子表主键默认设置为-1,再次查询,即可查询出子表记录

SELECT  pe.F_Id AS project_id, pe.F_ProjectYear, pe.F_ProjectTitle, si.F_FullName, si.F_ParentId, CASE WHEN pd.F_Id IS NULL 
                   THEN '-1' ELSE pd.F_Id END  F_Id, pd.F_ProjectFID, pd.F_ItemFID, pd.F_ContractName, pd.F_ProjectTime, 
                   pd.F_DocumentNumber, pd.F_ProjectFee, pd.F_FileFID, pd.F_SortCode, pd.F_DeleteMark, pd.F_EnabledMark, 
                   pd.F_Description, pd.F_CreatorTime, pd.F_CreatorUserId, pd.F_LastModifyTime, pd.F_LastModifyUserId, pd.F_DeleteTime, 
                   pd.F_DeleteUserId
FROM      dbo.Sys_Project AS pe LEFT OUTER JOIN
                   dbo.Sys_ProjectDetail AS pd ON pe.F_Id = pd.F_ProjectFID LEFT OUTER JOIN
                   dbo.Sys_Items AS si ON si.F_Id = pd.F_ItemFID AND si.F_EnCode = 'projectroot'
WHERE   (pe.F_IsDelete = 0)

关键点 : CASE WHEN pd.F_Id IS NULL THEN '-1' ELSE pd.F_Id END F_Id
复习点: Case具有两种格式。简单Case函数和Case搜索函数。

  • 简单Case函数CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END
  • Case搜索函数CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END

这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。

相关文章

  • 联合主键,及视图子表null值问题

    子表为空,但子表的FID不为null,导致根据主表字段查出来的值也为null解决方法:添加联合主键 (在view视...

  • Oracle 基础命令合集

    一 、视图 1、 创建视图 (联立两个表) 二、主键 1、 添加联合主键 后面补充 也可以在建表的时候就制定联合主...

  • MySql数据库·字段高级约束

    一、高级约束分为: 主键 (primary key) 表头值不允许重复,且不允许赋NULL值 表中只能有一个主键表...

  • mysql

    ❑ 任意两行都不具有相同的主键值;❑ 每个行都必须具有一个主键值(主键列不允许NULL值)在使用多列作为主键时,上...

  • Mysql联合索引的最左前缀原则以及b+tree

    联合索引的好处 覆盖索引,这一点是最重要的,重所周知非主键索引会先查到主键索引的值再从主键索引上拿到想要的值...

  • 黑猴子的家:mysql 列级约束

    1、常见约束 2、添加列级约束 3、插入默认值 唯一 + 主键 4、关于插入null 5、关于插入多个唯一或主键

  • Mysql必知必会之主键值规则

    1、任意两行都不具有相同的主键值 2、每行都必须具有一个主键值(主键列不允许NULL值) 1、可以使用多个列作为主...

  • MySQL基础知识

    主键(primary key):一列或一组列,其值能够唯一区分表中每个行(主键列不允许Null)。 模式(sche...

  • mysql索引

    索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯...

  • mysql

    SHOW COLUMNS FROM 数据表: 显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其...

网友评论

      本文标题:联合主键,及视图子表null值问题

      本文链接:https://www.haomeiwen.com/subject/hpslnttx.html