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       |

私の問題

sortsequence子の列が一意ではないレコードの ID とその子の ID (親 ID として存在するレコードの ID) を見つける必要があります。たとえば、id 1子を持つ場合2,3,4、sortsequence は2,3,4一意である必要があります。それらが一意でない場合、それらは欠陥のある記録であり、そのような記録を見つける必要があります。

コメント後に更新

idフィールドとフィールドから親子関係が成り立ってparentidいます。idあるレコードが他のレコードと同じように存在する場合parentid、これらの他のレコードはそれらのレコードの子です。ここで、parentid同じであるが sortsequence が一意でないレコードを見つける必要があります。 理想的な条件と正しい条件は、parentid と sortsequence が同じであるすべてのレコードが一意でなければならないことです。上記の場合、レコード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

このクエリは、最初に sortsequence が同じであるすべてのレコードを検索しますが、 に関して調べる必要がありますparentid。次に、このテーブルには数百万のレコードがあるため、処理時間が最小限のクエリが必要です。

4

3 に答える 3

0

障害のある条件で2つのテーブルを単純に結合するのはどうですか..同じ親を持つ場合、同じソートシーケンスを持つことはできません...

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 
     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 に答える
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 に答える