|
原帖由 tree_new_bee 于 2010-12-6 01:46 发表 ![]()
我的语句应该比你说的更彻底, 我不是加条件, 而是直接指定8个皇后的行号分别是1-8的。
select t1.c c1, t2.c c2, t3.c c3, t4.c c4, t5.c c5, t6.c c6, t7.c c7, t8.c c8
,0 r1, 1 r2, 2 r3, 3 r4, 4 r5, 5 r6, 6 r7, 7 r8 --行不同
from t t1, t t2, t t3, t t4, t t5, t t6, t t7, t t8
我又看了以前在75楼的写法,其实和你一样,指定的是列数。
WITH c AS (
SELECT id,x,y,x+y m,x-y n FROM (
SELECT ROWNUM id, MOD(ROWNUM-1,8)+1 x,CEIL(ROWNUM/8) y FROM DUAL CONNECT BY ROWNUM<=64
)
)
SELECT '('||c1.x||','||c1.y||')'
||'('||c2.x||','||c2.y||')'
||'('||c3.x||','||c3.y||')'
||'('||c4.x||','||c4.y||')'
||'('||c5.x||','||c5.y||')'
||'('||c6.x||','||c6.y||')'
||'('||c7.x||','||c7.y||')'
||'('||c8.x||','||c8.y||')'
FROM c c1,c c2,c c3,c c4,c c5,c c6,c c7,c c8
WHERE (c1.y,c2.y,c3.y,c4.y,c5.y,c6.y,c7.y,c8.y) IN ((1,2,3,4,5,6,7,8))
AND NOT (c1.x IN (c2.x,c3.x,c4.x,c5.x,c6.x,c7.x,c8.x)
OR c1.m IN (c2.m,c3.m,c4.m,c5.m,c6.m,c7.m,c8.m)
OR c1.n IN (c2.n,c3.n,c4.n,c5.n,c6.n,c7.n,c8.n)
OR c2.x IN (c3.x,c4.x,c5.x,c6.x,c7.x,c8.x)
OR c2.m IN (c3.m,c4.m,c5.m,c6.m,c7.m,c8.m)
OR c2.n IN (c3.n,c4.n,c5.n,c6.n,c7.n,c8.n)
OR c3.x IN (c4.x,c5.x,c6.x,c7.x,c8.x)
OR c3.m IN (c4.m,c5.m,c6.m,c7.m,c8.m)
OR c3.n IN (c4.n,c5.n,c6.n,c7.n,c8.n)
OR c4.x IN (c5.x,c6.x,c7.x,c8.x)
OR c4.m IN (c5.m,c6.m,c7.m,c8.m)
OR c4.n IN (c5.n,c6.n,c7.n,c8.n)
OR c5.x IN (c6.x,c7.x,c8.x)
OR c5.m IN (c6.m,c7.m,c8.m)
OR c5.n IN (c6.n,c7.n,c8.n)
OR c6.x IN (c7.x,c8.x)
OR c6.m IN (c7.m,c8.m)
OR c6.n IN (c7.n,c8.n)
OR c7.x IN (c8.x)
OR c7.m IN (c8.m)
OR c7.n IN (c8.n)
)
; |
|