Sql-Server 中 Parent-Child 关系的问题
Issue with Parent-Child Relationship in Sql-Server
假设我有两个 tables
在 sql server
中具有 parent-child 关系,如下所示,
parent table:
Parentid value
1 demo
2 demo2
child table:
childid parchildid subvalue
1 1 demo1
2 1 demo2
此处 parchildid
来自 child table
的 foreign 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)
假设我有两个 tables
在 sql server
中具有 parent-child 关系,如下所示,
parent table:
Parentid value
1 demo
2 demo2
child table:
childid parchildid subvalue
1 1 demo1
2 1 demo2
此处 parchildid
来自 child table
的 foreign 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)