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)