2011-03-30 45 views
0

03-30 13:17]如何使用子列中的列值在哪裏子句

我試圖使用t-sql與asp-3.0的SQL Server 2005。我想要做的是首先選擇符合一定的條件,然後我想知道有多少孩子被連接到該行基於它的childID的所有行。

這當然可以通過對數據庫一進行兩個查詢來獲得父對象的匹配行以及發現知道有多少個子對象具有父對象的每行的一個查詢。

我有兩個表,table1包含父母和孩子,table2包含信息,這裏的id是ofcourse在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.的NUMER聲明808如下。
SELECT COUNT(*) AS AntalPoster FROM Tabel1 INNER JOIN Tabel2 ON Child = ID
WHERE (Parent = 808)

我想要做的是下面的,但我想每個記錄讓我對孩子又名SearchID值來替代值808。
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

我認爲你需要發佈你的表的結構。真的很難理解父母是什麼以及'ChildID','ID','Child','Parent'和'ParentID'屬於什麼以及它們之間的關係。 – 2011-03-30 11:34:17

+0

首先重寫你的選擇,在內部和外部選擇和字段中使用(不同的)別名 - maks查詢的可讀性很強,可能你會看到,你如何完成你的任務(提示:where inner.parent = outer.child )。 – Arvo 2011-03-30 11:36:00

回答

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 
+0

這看起來很有希望,明天當我回去工作時會試圖做到這一點。 – 2011-03-30 18:48:57

+0

工作就像一個魅力,不得不做一個連接稍作修改,因爲我沒有從T2獲取數據,但隨着這種變化,它降低了對數據庫的調用,並使查詢速度提高了10倍,感謝所有幫助。 – 2011-04-05 09:17:18

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; 
+0

這給了我的父頁有帖子的數量,但我想知道childpage有多少帖子。 F.ex. ParentID 807有2個子項,ChildPage 808和ChildPage 809. ParentPage 809(與Childpage相同,但現在作爲父項)有72個子項。 我想表現的是ID 808(5個孩子)ID 809(72個孩子)。通過上面的sql語句,我得到了ID 808(2個孩子)ID 809(2個孩子),這是807個孩子的數量。 希望能更好地闡明它。 – 2011-03-30 09:31:30

+1

我認爲你只需要改變連接子句,但發佈表結構和一些數據會更清晰 – Karel 2011-03-30 09:45:44

0

的更好,如果你定義一個 「別名」 你不能使用此列命名查詢比group byorder by子句中較早內。

正如您的例子SearchID僅僅是Child
一個名字,你應該使用WHERE (PARENT = Child)

+0

我可能並沒有描述我的問題和我想要的東西。但是如果我將其更改爲WHERE(PARENT = Child),那麼我將得到0作爲AntalPoster的值。 – 2011-03-30 09:40:48

0

你還挺近。

SELECT Parent_ID, COUNT(*) AS AntalPoster FROM Tabel1 INNER JOIN Tabel2 ON Child = ID 
Group by Parent_ID 

現在我不ID‘字段被稱爲」從閱讀你的問題是什麼不太明白’......但是這查詢的結果應該給PARENT_ID與孩子的記錄數的計數一起(如果我仔細閱讀過你的設置)。加入到該subquerty獲得計數。

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上加入該子查詢以獲取子查詢返回的計數值。

+0

我的問題是,我知道值807,但我不知道在發送語句時的值808,我想從第一個sql語句中獲取ID 808,並從中使用該語句中的值得到連接的孩子的數量。我可以簡單地通過再次調用數據庫來做到這一點,但是這對數據庫來說是一個額外的往返行爲,我想要做的只是一次去那裏,獲取所有數據並關閉連接。那可能嗎? – 2011-03-30 18:47:38

+0

啊,對不起。我的確有部分錯過了這個問題。我正在爲你編輯我的答案。 – Twelfth 2011-03-30 19:07:24

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