1

我有下表tbl_info

  ---------------------------------------
  |  id   |  parentid  |  sortsequence  |
  |--------------------------------------
  | 1     |   0        |        1       | 
  |--------------------------------------
  | 2     |   1        |        1       | 
  |--------------------------------------
  | 3     |   1        |        1       | 
  |--------------------------------------
  | 4     |   1        |        2       |
  |--------------------------------------
  | 5     |   0        |        1       | 
  |--------------------------------------
  | 6     |   5        |        1       | 
  |-------------------------------------|
  | 7     |   5        |        2       |

我的问题

我需要找出那些记录的 id 及其子 id(其中某些记录的 id 作为 parentid 存在),其子sortsequence列不是唯一的。例如,如果id 1有孩子2,3,4,那么 sortsequence2,3,4必须是唯一的。如果它们不是唯一的,它们就是错误的记录,我需要找出这些记录。

评论后更新

父子关系由idparentid字段组成。如果id某些记录parentid与其他记录一样存在,则这些其他记录是这些记录的子项。现在我需要找出那些parentid相同但 sortsequence 不是唯一的记录。 理想条件和正确条件是所有 parentid 相同的记录,则 sortsequence 必须是 unqiue。在上述情况下,记录2,3,4是错误的记录。我需要找出这些记录

到目前为止我做了什么

我搜索了很多并写了这个查询

SELECT id, parentid, tbl_info.sortsequence FROM tbl_info
   INNER JOIN (SELECT sortsequence FROM tbl_info
GROUP BY sortsequence HAVING COUNT(id) > 1) dup ON tbl_info.sortsequence = dup.sortsequence

此查询首先查找排序顺序相同但我需要查找的所有记录parentid。其次,我在这个表中有数百万条记录,所以我需要一个处理时间最短的查询。

4

3 回答 3

0

在有故障的情况下简单地加入两个表怎么样..如果有相同的父级,你不能有相同的排序序列......

SELECT child.id AS [thischild]
, child.sortsequence AS [isinthespot]
, sibling.id AS [allongwiththissibling]
FROM tbl_info child
INNER JOIN tbl_info sibling ON child.parentid = sibling.parentid --sameparent
AND child.sortsequence = sibling.sortsequence --and in sameplace
WHERE child.parentid > 0 --remove roots
AND child.id < sibling.id --remove duplicate return (because 2 is in same spot as 5 AND 5 is in the same spot as 2 )
于 2013-03-08T10:10:36.953 回答
0

同样,如果我理解正确:

SELECT * FROM tbl_info WHERE parentid in (
SELECT parentid FROM tbl_info
GROUP BY parentid
HAVING COUNT(DISTINCT sortsequence) <> COUNT(sortsequence)
)
于 2013-03-08T10:12:29.747 回答
0

试试这个查询

SELECT 
     distinct b.id 
FROM 
     tbl b, 
     (select 
          t1.parentid AS rId
          FROM 
             tbl t1
          group by 
             t1.parentid
          HAVING 
             count(t1.parentid) <> count(distinct t1.sortsequence)
     ) a
WHERE 
     a.rId = b.id  or
     a.rId = b.parentId;

内部查询列表是不具有唯一排序序列的 parentId,其结果用于列出该 id 的父项和子项。

希望这可以帮助

小提琴

于 2013-03-08T11:05:05.037 回答