如何在子字符串where子句中使用列值

时间:2011-03-30 09:13:08

标签: sql tsql

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子句中用作值

这是可能的,如果是这样的话?

提前致谢。

5 个答案:

答案 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 byorder 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上连接到该子查询以获取子查询返回的计数值。