03-30 13:17]
我正在尝试使用带有asp 3.0的SQL-Server 2005的t-sql。我想要做的是首先选择符合特定条件的所有行,然后我想知道基于它的ChildID有多少个孩子连接到该行。
当然,这可以通过对db 1执行两次查询来获取Parent的匹配行,并且每行查找一行以了解有多少孩子将其作为Parent。
我有两个表,table1包含父项和子项,table2包含信息,这里的id是当前在table1中保存在父项和子项中的id。
现在我想首先找到某个父母的所有孩子,并且在同一个sql语句中我想知道每个孩子有多少孩子。
所以父母807有两个孩子,808和809. 808有5个孩子,809有72个孩子,我怎么能用一个陈述同时获得808和809孩子的信息以及与他们相关的孩子的数量。
我的SQL看起来像这样(将孩子送到父807)
SELECT Parent, Child, ID, FieldX, FieldY
FROM Tabel1 INNER JOIN Tabel2 ON Parent = ID
WHERE (Parent = 807)
我用来获得连接到f.ex.的子项的数字的语句。 808如下
SELECT COUNT(*) AS AntalPoster
FROM Tabel1 INNER JOIN Tabel2 ON Child = ID
WHERE (Parent = 808)
我想要做的是以下内容,但我想用值808替换每个记录为我的孩子也称为SearchID的值。
SELECT Parent, Child AS SearchID, ID, FieldX, FieldY,
(SELECT COUNT(*) AS [Antal sidor]
FROM Tabel1 INNER JOIN Tabel2 ON Child = ID
WHERE (Parent = 808)) AS AntalPoster
FROM Tabel1 INNER JOIN Tabel2 ON Child = ID
WHERE (Parent = 807)
我得到的问题是“无效的列名'SearchID'”,我能理解的是,我无法获得在SerachID中找到的值,以便在下一个SQL语句where子句中用作值
这是可能的,如果是这样的话?
提前致谢。
答案 0 :(得分:1)
所以,据我所知,基本上Table1
包含层次结构信息和Table2
详细信息。
假设,这是我的方法:
SELECT
h.Parent,
h.ChCount,
d.* /* you may want to expand it to a specific Table2 column list */
FROM (
/* first, get the children and their child counts */
SELECT
p.Parent,
p.Child,
COUNT(*) AS ChCount
FROM Table1 p
INNER JOIN Table1 c ON p.Child = c.Parent
GROUP BY p.Parent, p.Child
WHERE p.Parent = 807
) h
/* next, get the children's details */
INNER JOIN Table2 d ON h.Child = d.ID
答案 1 :(得分:0)
替换
WHERE (Parent = SearchID))
通过
WHERE (Parent = ParentID))
但你最好使用
SELECT Parent, Child, ID, FieldX, FieldY, COUNT(*) AS AntalPoster
FROM Tabel1 INNER JOIN Tabel2 ON Child = ID
WHERE (Parent = [ParentID])
GROUP
BY Parent, Child, ID, FieldX, FieldY;
答案 2 :(得分:0)
如果为列定义“别名”,则不能在group by
或order by
子句中的查询中使用此名称。
您的示例SearchID
只是列Child
的名称,您应该使用WHERE (PARENT = Child)
答案 3 :(得分:0)
现在我想首先找到某个父母的所有孩子,并且在同一个sql语句中我想知道每个孩子有多少孩子。
这是一种方法。
declare @Table1 table (Table1ID int, ParentID int)
-- Root
insert into @Table1 values(807, null)
-- Children to 807
insert into @Table1 values(808, 807)
insert into @Table1 values(809, 807)
-- Children to 808
insert into @Table1 values(810, 808)
-- Children to 809
insert into @Table1 values(811, 809)
insert into @Table1 values(812, 809)
select
T1.*,
(select count(*)
from @Table1 as T2
where T1.Table1ID = T2.ParentID) as ChildCount
from @Table1 as T1
where T1.ParentID = 807
结果
Table1ID ParentID ChildCount
----------- ----------- -----------
808 807 1
809 807 2
答案 4 :(得分:0)
你有点亲近。
SELECT Parent_ID, COUNT(*) AS AntalPoster FROM Tabel1 INNER JOIN Tabel2 ON Child = ID
Group by Parent_ID
现在我从阅读你的问题中完全理解“ID”字段被调用的内容......但是这个查询的结果应该给出Parent_ID以及子记录数量的计数(如果我读过的话)你的设置核心)。加入那个次级来获得统计数据。
SELECT Parent, Child.AntalPoster, ID, FieldX, FieldY
FROM Tabel1 INNER JOIN Tabel2 ON Parent = ID
inner join (SELECT Parent_ID, COUNT(*) AS AntalPoster FROM Tabel1 INNER JOIN Tabel2 ON Child = ID Group by Parent_ID) child on child.id = t1.ID
WHERE (Parent = 807)
在你的例子中,我真的很困惑......如果我仍然关注你的目标......快速给我们提供架构会有所帮助。表设置是否有父,子,ID?如果是这样,工作怎么样?我希望Parent_ID,Child_ID ...在第三个“ID”列上有点混淆,它对于已经存在的父列子列有什么独特之处?
在任何情况下,逻辑都设置一个子查询,因此它读取Key,Count(1)。然后在Key上连接到该子查询以获取子查询返回的计数值。