SQL以确保传入id不在字段中

SQL以确保传入id不在字段中,sql,Sql,我有3个字段(1年级、2年级、3年级),我带着一个年级ID进来,我想确保年级ID不是这三个字段中的一个(如果它们不为null) 我做对了吗 WHERE @fycuserid <> ISNULL(grader1_fyc,0) AND @fycuserid <> ISNULL(grader2_fyc,0) AND @fycuserid <> ISNULL(grader3_fyc,0) 其中@fycuserid为空(等级1\u fyc,0) 而@fycuserid

我有3个字段(1年级、2年级、3年级),我带着一个年级ID进来,我想确保年级ID不是这三个字段中的一个(如果它们不为null)

我做对了吗

WHERE @fycuserid <> ISNULL(grader1_fyc,0)
AND @fycuserid <> ISNULL(grader2_fyc,0)
AND @fycuserid <> ISNULL(grader3_fyc,0)
其中@fycuserid为空(等级1\u fyc,0)
而@fycuserid为空(等级2_fyc,0)
而@fycuserid为空(等级3_fyc,0)

首先,你不能只说“SQL”,因为每个数据库都有自己的SQL。例如,在DB2中,您会说:

WHERE @fycuserid <> COALESCE(grader1_fyc, 0)
其中@fycuserid聚结(等级1\u fyc,0)

也就是说,假设您的DB的ISNULL相当于COALESCE,那么您的代码对我来说似乎很好。

好吧,没问题,还有更好的。正如你所描述的那样,这个设计还可以——它可能会做你想做的事情——但是有办法让它变得更好

就目前情况而言,该表有三个字段,所有字段都包含基本相同的信息——评分员的ID。如您所见,要检查这些字段中的每一个字段,必须编写特殊代码,将过程参数与grader1、grader2和grader3进行比较,并且每次进行类似比较时,都必须重复此特殊代码。这没关系,但我想你可以看到这会变得有点麻烦

在执行数据库规范化时,会应用某些规则,有时还必须更改数据库设计。要确定表是否处于第一范式,需要检查的基本内容包括

  • 该表是否忠实地表示了一种关系,以及
  • 有重复的小组吗
  • 从你的帖子中很难说表是否正确地表示了一个关系,但是从给出的信息中很容易看出有一组重复的字段——三级字段。这三个字段可以从此表中删除,并添加一个新表。假设文章中提到的表是PAPERS,它包含一个名为ID_PAPERS的主键。一个用来保存对论文进行评分的评分员信息的表格可以称为paper_graders,可能如下所示:

    CREATE TABLE PAPER_GRADERS
      (ID_PAPER    NUMBER
         REFERENCES PAPERS(ID_PAPER),
       ID_GRADER   NUMBER
         REFERENCES GRADERS(ID_GRADER),
       PRIMARY KEY (ID_PAPER, ID_GRADER));
    
    现在,如果一篇论文是由给定的评分员评分的,那么将在paper_GRADERS中创建一行,其中包含该论文的ID和评分员的ID。如果一篇论文由两名评分员评分,那么在paper_graders中会创建两行,每行都有相同的ID_论文,但每行都有不同的评分员ID。这就是所谓的“一对多”关系——在这种情况下,一篇论文可以由多个评分员评分,一篇论文的评分员数量没有限制

    现在,在最初提到的过程中,不必显式检查三个分级器字段之一是否包含传递给该过程的分级器的ID,SQL将是不同的-您将进行纸张和纸张分级器的内部联接,查找与参数匹配的现有分级器。执行此操作的SELECT

    SELECT *
      FROM PAPERS p
    INNER JOIN PAPER_GRADERS g
      USING (ID_PAPER)
    WHERE g.GRADER = @fycuserid
    
    这种类型的数据库构造非常方便


    我希望这能有所帮助。

    一级、二级和三级之间是否有语义上的区别,或者它们是否可以有效地互换?(不知道您的表是否在1NF中)@OMG,ISNULL看起来像SQLServer语法,而Caveatrob似乎有SQLServer的标记(但没有其他风格的SQL)。grader[n]\u fyc是第[n]个grader的ID,还是记录的分数?如果是前者,您现有的子句看起来很好。