Sql-Server中的父子关系问题

时间:2016-05-20 06:49:46

标签: sql sql-server tsql parent-child

假设我在tables中有两个sql server亲子关系,如下所示,

父表:

Parentid  value 

1         demo
2         demo2

子表:

childid     parchildid   subvalue

1           1            demo1
2           1            demo2
来自parchildid的{​​{1}}来自child table foreign key parentid

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

parent table

它给出了以下输出。 ( select *from child where parchildid in (select parchildid from parent) )的所有行

child table

但是如您所见,我在子查询中提供了 childid parchildid subvalue 1 1 demo1 2 1 demo2 列(invalid)(parchildid属于parchildid而不是child table )。

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

正在运行sql server 单独查询会导致select parchildid from parent列错误。

任何人都可以解释为什么子查询中没有抛出错误?那逻辑在哪里工作?

由于

5 个答案:

答案 0 :(得分:4)

来自MSDN

  

如果子查询的FROM子句中引用的表中不存在列,则它将由外部查询的FROM子句中引用的表隐式限定。

在您的情况下,由于parchildid是外部查询中表的列,因此没有错误。然而,在它自己的情况下,查询无法找到这样的列,因此它失败了。

答案 1 :(得分:2)

相当于写作:

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
     )

答案 2 :(得分:1)

它仅提供父ID和子ID相同的记录。

答案 3 :(得分:1)

由于您的要求是检索特定parentid的子表数据使用 parentid而不是parchildid 。这里因为来自子表的 parchildid 是指父表的 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

答案 4 :(得分:1)

喜欢这个

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