我有3个领域(平地机1,平地机2,平地机3),我带着一个平地机ID进入,我想确保评分者身份不是三个中的一个(如果他们是不是空的。)
我做对了吗?
WHERE @fycuserid <> ISNULL(grader1_fyc,0)
AND @fycuserid <> ISNULL(grader2_fyc,0)
AND @fycuserid <> ISNULL(grader3_fyc,0)
答案 0 :(得分:1)
首先,你不能只说“SQL”,因为每个数据库都有它自己的SQL。例如,在DB2中你会说:
WHERE @fycuserid <> COALESCE(grader1_fyc, 0)
话虽如此,假设您的DB的ISNULL等同于COALESCE,您的代码对我来说似乎很好。
答案 1 :(得分:1)
嗯,没关系,还有更好的。你所描述的设计是可以的 - 它可能会做你想要的 - 但有一些方法可以让它变得更好。
根据情况,有问题的表有三个字段,所有字段都包含基本相同的信息 - 评分者的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_PAPER,但每行具有不同评分者的ID。这就是所谓的“一对多”关系 - 在这种情况下,一篇论文可以由许多评分者评分,并且对一篇论文的评分者数量没有限制。
现在,在最初提到的过程中,不必显式检查三个评分者字段中的一个是否包含传递给过程的分级器的ID,而SQL将是不同的 - 您将执行PAPERS和PAPER_GRADERS的内连接,寻找与参数匹配的现有分级器。执行此操作的SELECT看起来像
SELECT *
FROM PAPERS p
INNER JOIN PAPER_GRADERS g
USING (ID_PAPER)
WHERE g.GRADER = @fycuserid
这种类型的数据库构造非常方便。
我希望这会有所帮助。