Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 Server中的父子关系问题_Sql_Sql Server_Tsql_Parent Child - Fatal编程技术网

Sql Server中的父子关系问题

Sql Server中的父子关系问题,sql,sql-server,tsql,parent-child,Sql,Sql Server,Tsql,Parent Child,假设我在sql server中有两个具有父子关系的表,如下所示 父表: Parentid value 1 demo 2 demo2 子表: childid parchildid subvalue 1 1 demo1 2 1 demo2 这里parchildid来自子表是一个外键引用父表的parentid 我需要检索特定parentid的子表数据。所以,我使用

假设我在
sql server
中有两个具有父子关系的
表,如下所示

父表:

Parentid  value 

1         demo
2         demo2
子表:

childid     parchildid   subvalue

1           1            demo1
2           1            demo2
这里
parchildid
来自
子表
是一个
外键
引用
父表
parentid

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

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

但是正如您所看到的,我在子查询(
parchildid
属于
子表
而不是
父表
)中给出了一个
无效的
列(
parchildid

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

正在运行
从父级选择parchildid
单独查询时出现
无效
列错误

有人能解释为什么子查询中没有抛出错误吗?那里的逻辑是如何运作的

感谢:

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


在您的例子中,由于
parchildid
是外部查询表中的一列,因此没有错误。但是,查询本身找不到这样的列,因此失败。

它只给出父id和子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
     )

由于您的要求是检索特定parentid的子表数据,因此请使用parchildid而不是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')
使用包裹

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)

没有错误,因为子查询中可以引用主
SELECT
查询中的列。基本上,您正在检查
childid=1
是否在
1
中,这总是正确的,因此,子表中的所有行都会显示。请查看在联接中执行此操作,而不是在当前执行此操作的where子句中。这是因为您可以在内部表中使用外部字段,因此它被视为子表字段。谢谢,但您不能在子表的父表中没有值,是吗?如果您正在使用外键关系。否则可能会有。:)
 select * from child
 where parchildid in (select Parentid from parent)