Sql-Server 中 Parent-Child 关系的问题

Issue with Parent-Child Relationship in Sql-Server

假设我有两个 tablessql server 中具有 parent-child 关系,如下所示,

parent table:

Parentid  value 

1         demo
2         demo2

child table:

childid     parchildid   subvalue

1           1            demo1
2           1            demo2

此处 parchildid 来自 child tableforeign key 指的是 parent table.

parentid

我需要检索特定 parentid 的 child table 数据。所以,我使用了下面的查询

 select *from child
 where parchildid in (select parchildid from parent)

它给出了以下输出。 (child table 的所有行)

 childid    parchildid   subvalue

  1         1            demo1
  2         1            demo2

但是如您所见,我在 sub-query(parchildid 属于 child table 而不是 parent table ).

我想知道为什么 sql server 没有抛出任何错误。

运行 select parchildid from parent 单独查询会引发 invalid 列错误。

谁能解释为什么 sub-query 中没有抛出错误?那里的逻辑是如何工作的?

谢谢

来自MSDN

If a column does not exist in the table referenced in the FROM clause of a subquery, it is implicitly qualified by the table referenced in the FROM clause of the outer query.

在您的情况下,由于 parchildid 是外部查询中 table 的列,因此没有错误。然而,查询本身找不到这样的列,因此失败。

它只给出父子id相同的记录。

相当于写成:

select *
  from child c
 where c.parchildid in 
     (
        select c.parchildid
          from parent p
     )

如果您注意到,child 有一个别名 c,可以在子查询中访问它。

写的也像:

select *
  from child c
 where Exists 
     (
        select *
          from parent p
         where c.parchildid = c.parchildid
     )

由于您的要求是检索特定 parentidchild table 数据 使用 parentid 而不是 parchildid。这里因为来自子 table 的 parchildid 是引用父 table 的 parentid 的外键,所以没有问题。否则它会影响您的结果集。请检查以下代码

DECLARE @Parent TABLE
(Parentid int, Value varchar(10))

DECLARE @Child TABLE
(Childid int, parchildid int, subvalue varchar(10))

INSERT @Parent
(Parentid,[Value])
VALUES
(1,'demo'),(2,'demo2')

INSERT @Child
(Childid,parchildid,subvalue)
VALUES
(1,1,'demo'),(2,1,'demo2'),(3,3,'demo3')

使用 parchildid

select * from @Child
where parchildid in (select parchildid from @Parent)

输出:

 Childid    parchildid  subvalue
 1          1           demo
 2          1           demo2
 3          3           demo3

使用 Parentid

select * from @Child
where parchildid in (select Parentid from @Parent)

输出:

Childid parchildid  subvalue
 1          1           demo
 2          1           demo2

喜欢这个

 select * from child
 where parchildid in (select Parentid from parent)