Как использовать значение столбца в подстроке, где предложение - PullRequest
0 голосов
/ 30 марта 2011

03-30 13:17]

Я пытаюсь использовать t-sql против SQL-Server 2005 с asp 3.0.Что я хочу сделать, это сначала выбрать все строки, которые соответствуют определенному условию, а затем я хочу узнать, сколько детей подключено к этой строке, основываясь на его ChildID.

Это, конечно, можно сделать, просто выполнивдва запроса к базе данных db, чтобы получить совпадающие строки для Parent, и по одному для каждой найденной строки, чтобы узнать, сколько дочерних элементов имеет это как Parent.

У меня есть две таблицы, table1 содержит родителей и детей и table2содержит информацию, и идентификатор здесь, конечно, идентификатор, который сохраняется в parent и children в table1.

Теперь я хочу сначала найти всех потомков для определенного родителя, и в том же SQL-выражении, которое я хочучтобы узнать, сколько детей связано с каждым ребенком.

Итак, у родителя 807 двое детей, 808 и 809. У 808 пятеро детей, а у 809 72 ребенка, как я могу с помощью одного утверждения получить информацию о детях808 и 809 и число дочерних элементов, подключенных к каждому из них.

Мой SQL выглядит следующим образом (получитьs дети к родителю 807)

SELECT Parent, Child, ID, FieldX, FieldY<br> FROM Tabel1 INNER JOIN Tabel2 ON Parent = ID<br> WHERE (Parent = 807)

Утверждение, которое я использую, чтобы связать число детей с f.ex.808 выглядит следующим образом.
SELECT COUNT(*) AS AntalPoster FROM Tabel1 INNER JOIN Tabel2 ON Child = ID<br> WHERE (Parent = 808)

То, что я хотел бы сделать, - это следующее, но я хотел бы заменить значение 808 значением, которое каждая запись дает мне для дочернего элемента, известного как SearchID.
SELECT Parent, Child AS SearchID, ID, FieldX, FieldY,<br> (SELECT COUNT(*) AS [Antal sidor]<br> FROM Tabel1 INNER JOIN Tabel2 ON Child = ID<br> WHERE (Parent = 808)) AS AntalPoster<br> FROM Tabel1 INNER JOIN Tabel2 ON Child = ID WHERE (Parent = 807)

Проблема, которую я получаю, заключается в том, что «Недопустимое имя столбца« SearchID »», я могу понять, что не могу получить значение, найденное в SerachID, для использования в качестве значенияв следующих предложениях SQL, где предложение.

Возможно ли это, и если да, то как?

Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 31 марта 2011

Итак, я понимаю, что в основном 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
0 голосов
/ 30 марта 2011

Ты вроде близко.

 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) 

Что действительно смущает меня в вашем примере ... если я все еще не согласен с тем, что вы собираетесь ... быстро дать нам схемуПомогите.Настроена ли таблица так, чтобы у нее были Parent, Child, ID?Если да, то как работает?Я ожидаю, что Parent_ID, Child_ID ... немного запутаны в третьем столбце «ID», что в нем содержится, что уникально для родительских, дочерних столбцов, которые уже существуют?

В любом случае логика настраивает подзапрос, поэтому она читает Key, Count (1).Затем присоединитесь к этому подзапросу в ключе, чтобы получить значение счетчика, возвращаемое подзапросом.

0 голосов
/ 30 марта 2011

Если вы определили «псевдоним» для столбца, вы не сможете использовать это имя внутри запроса раньше, чем в предложении group by или order by.

Как и в вашем примере SearchID это просто имя для столбца Child
, вы должны использовать WHERE (PARENT = Child)

0 голосов
/ 30 марта 2011

Теперь я хочу сначала найти всех детей определенного родителя, и в том же 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 голосов
/ 30 марта 2011

Заменить

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...