假设我在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
列错误。
任何人都可以解释为什么子查询中没有抛出错误?那逻辑在哪里工作?
由于
答案 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)