2009-05-09 4 views
2

중첩 된 모델을 사용하여 iPhone의 로컬 SQLite 데이터베이스에 대규모 데이터 계층을 저장합니다. 나는 그들의 웹 사이트에서 MySQL tech article을 읽는 방법을 알려주지 만, 그들이 제안한 (그리고 필자가 필요로하는) ​​쿼리 중 하나는 SQLite와 함께 작동하지 않는 것으로 보이고이를 해결하는 방법을 모르겠습니다.SQLite 쿼리의 하위 쿼리가 작동하지 않습니다.

SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth 
FROM line_items AS node, 
    line_items AS parent, 
    line_items AS sub_parent, 
    (SELECT node.name, (COUNT(parent.name) - 1) AS depth 
     FROM line_items AS node, 
     line_items AS parent 
     WHERE node.lft BETWEEN parent.lft AND parent.rgt 
     AND node.name = 'Power Up' 
     GROUP BY node.name 
     ORDER BY node.lft 
    ) AS sub_tree 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
    AND sub_parent.name = sub_tree.name 
GROUP BY node.name 
HAVING depth <= 1 
ORDER BY node.lft; 

SQLite는이 sub_tree.name이 열 아니라고보고, 나는 그 하위 쿼리 구현이 불완전하기 때문입니다 가정합니다. 누구든지이 한계를 극복하는 방법에 대한 아이디어가 있습니까?

쿼리의 목적은 주어진 부모 노드의 모든 직계 하위 노드를 가져 오는 것입니다. 서브 쿼리에서 "이름 그대로 node.name"을 사용하여

답변

3

시도, 즉

SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth 
FROM line_items AS node, 
    line_items AS parent, 
    line_items AS sub_parent, 
    (SELECT node.name AS name, (COUNT(parent.name) - 1) AS depth 
     FROM line_items AS node, 
     line_items AS parent 
     WHERE node.lft BETWEEN parent.lft AND parent.rgt 
     AND node.name = 'Power Up' 
     GROUP BY node.name 
     ORDER BY node.lft 
    ) AS sub_tree 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
    AND sub_parent.name = sub_tree.name 
GROUP BY node.name 
HAVING depth <= 1 
ORDER BY node.lft; 

은 적어도 오류를 제거하는 것 같다.

+1

거의 완전히 수정했습니다. 어떤 이유로 든 수포의 깊이가 1보다 작아서 효과가 없었습니다. sub_tree.depth와 최상위 레벨 사이에서 혼란스러워지고 있다는 것을 알게되었습니다. 방금 최상위 레벨의 이름을 바꿨고 효과가있었습니다. 감사! –

관련 문제