|
我有这样设置的表:
) R! q9 m- L J7 q5 pParent. z! K7 o1 u7 X" d
------) d1 q5 U! j/ w& g) g
id, ...
) m& \. z, p3 |' f. wChild* ], K. o# S8 G( c
-----# P+ a8 M+ R \7 z0 K ~
id, parent_id, x, y/ I9 l, ^" Y. y5 O4 [% ?
如果Child中包含给定parent_id的 所有 行均符合涉及x和y的条件(在我的情况下,x =
3 U9 e# Y7 Z/ K: _1 p3 S) Ty),我想找到Parents或不同的parent_id 。0 x. ]$ m( Q) [/ m9 T9 a, ?/ y/ h
例如:* @5 U# z" v/ I& {3 d" A* J7 _
Parent8 a! G y- r& {' `
------
1 o9 o4 h, m/ i3 j }% ?id! L' d7 z% D$ Q& K6 `
1
. C. |, w2 @3 V* c. B! g7 k& T4 {3 a 2
( H; g" D! h3 J9 }* k! R% W 3
0 \( t, Z$ U/ M, j! ]Child
7 q1 n! ~# G" f0 F( f5 d Iid, parent_id, x, y
5 e9 H1 e0 ~# j3 C% ~, m4 y1, 1, 2, 3
( M4 S" r# G u- g% G2, 1, 3, 47 ~) m( o' K9 b
3, 2, 5, 5
; X* ~. }7 n. {4, 2, 6, 7
1 C7 [/ N* p/ h: L* [5, 3, 8, 8, N3 |) x3 L' _6 R4 k' z' b6 }/ f
6, 3, 9, 93 K! q$ B" T4 i6 `" L# ^2 W) f
将会得到3。当前,我有一个查询,查找 任何子级 都符合条件的parent_ids
, \# X x# p: i- M) Z5 @. [5 v。然后,我用它来检索那些记录,并在所有子级都符合条件的情况下在代码中检查它们。通过示例数据,我得到parent_id E+ L% w5 W3 g
2和3,获得所有子代的两个父记录,然后求值。如果可能,我想通过一个查询来执行此操作。
4 B& h* v* B: v& s2 Q/ L
( b2 ^' E: c$ z解决方案:
' O/ S4 X1 q7 y * O5 g! I0 M$ j. F
6 P3 w) _$ e8 p+ S
' t, d- }7 K" }$ c) N* G- M 您可以使用 NOT EXISTS
) Y0 K9 E, B& `( m- Z9 ]# m( T8 wSELECT id
: I, O9 n# v9 e! fFROM Parent p( [. Z6 M6 R" h9 b( Y' X
WHERE NOT EXISTS# t O* K3 p' M
(
5 ]6 _5 C; c; |+ D- m" K' g SELECT 1 FROM Child c5 l! u: v5 u8 k. c0 o D
WHERE c.parent_Id = p.id) b, ?, ?& u7 k
AND c.x c.y
A# B' X" u+ b5 f% K$ F)/ i: x7 ?5 N. c$ W
编辑:这是sql小提琴:http ://sqlfiddle.com/#!
0 y- |$ G7 O; _3/20128/1/0 |
|