Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何查找违反引用完整性的记录_Sql_Sql Server - Fatal编程技术网

Sql 如何查找违反引用完整性的记录

Sql 如何查找违反引用完整性的记录,sql,sql-server,Sql,Sql Server,我有两个表,它们应该处于一对多关系中,但是在表的多方面似乎有一些记录阻止了关系的创建。违反引用完整性 由于两个表中都有很多记录,有没有办法查询哪些记录在多个表中,而不是在一个表中 **Ex.** Table 1: (one side) (pk)AccountId Table 2: (many side) (pk)UserId (fk)AccountId <-- Some accountId's are not in Table 1 **Ex** 表1:(单面) (pk)帐户I

我有两个表,它们应该处于一对多关系中,但是在表的多方面似乎有一些记录阻止了关系的创建。违反引用完整性

由于两个表中都有很多记录,有没有办法查询哪些记录在多个表中,而不是在一个表中

**Ex.**

Table 1: (one side)
(pk)AccountId


Table 2: (many side)
(pk)UserId
(fk)AccountId  <--  Some accountId's are not in Table 1 
**Ex**
表1:(单面)
(pk)帐户ID
表2:(多方面)
(pk)用户标识
(fk)帐户ID

或者如果你喜欢加入

FROM Table2 t2
  LEFT JOIN Table1 t1
  ON t2.AccountId = t1.AccountId
WHERE t1.AccountId is null

您应该更喜欢加入,或者更好的是,存在
不在
中从来都不是一个好的做法,因为在这种情况下(或者在其他情况下,人们可能会从中学习并应用到他们自己的场景中),子查询中的列可以为null,这将返回unknown,这将使NOT为false,这意味着您将返回所有行。@Aaron Bertrand:可为null的主键。。。你肯定是在开玩笑吧?这不是重点。你看过我的全部评论了吗?另外,既然外键还不存在,你怎么能确定主键已经存在于这两个表中呢?@JeremyHolovacs我的评论的要点很简单,notin是一个坏模式。时期我认为现在有很多抱怨和呻吟让未来的读者能够做出自己的决定。@DavidB,在人们开始抱怨一个20分钟的问题之前,这一切都是有趣和游戏,应该会立即返回。这是一种糟糕的做法,在大多数实际用例中,效率明显降低。暗示一个有效的反连接是伏都教。。。我不知道该怎么回答,但我希望你的DBA会给你一些废话:)我强烈建议你以左外连接的形式重新编写。对于大多数用户来说,右连接并不直观。谢谢您的建议。对我来说,右连接是反-(左连接)。在这种情况下,左外连接对我来说是不直观的。在我的经验中,你是个例外。你是为你还是为社区的其他人写答案?当然是为社区的其他人。若社区将检查答案,并看到它是工作的,他们将使用正确的加入,这将变得更直观。Bwahahahahahaok。事情不会因为被复制和粘贴而变得神奇直观。你确定外键已经被显式创建了吗?@AaronBertrand-问题是外键创建失败对不起,错过了隐藏的文本“阻止关系”。。。代码示例使外键约束看起来已经存在。哈,我犯了同样的错误。
SELECT table2.UserId, table2.AccountId
FROM table1 RIGHT JOIN table2 ON table1.AccountId = table2.AccountId
WHERE table1.AccountId IS NULL;
select a.*
from Table2 as a
where not exists (select null from table1 as b where b.AccountId = a.AccountId);
FROM Table2 t2
WHERE t2.AccountId not in (SELECT t1.AccountId FROM Table1 t1)
FROM Table2 t2
  LEFT JOIN Table1 t1
  ON t2.AccountId = t1.AccountId
WHERE t1.AccountId is null