我想用连续编号修饰表中每个重复组的每个成员。因此,对于:SQL将使用连续编号修饰重复组的每个成员
id fk scheme code
1 23 2 1234
2 23 2 6666
3 23 2 9876
4 24 2 3421
5 24 5 erty
6 24 7 wert
7 25 2 3490
8 25 2 2389
9 25 5 erfg
我会在我的结果看
23|2|1 1234
23|2|2 6666
23|2|3 9876
24|2|1 3421
24|5|1 erty
24|7|1 wert
25|2|1 3490
25|2|2 2389
25|5|1 erfg
与方案,以便FK相结合,使重复组。我知道我在重复组中只有5个,但我的测试查询只允许3个。顺序行号不会作为修饰,它只能用于1或2或3,因为它们用于缓存查找。
这里是我想出了把H2 Db的SQL语法的SQL:
SELECT "identifier", "code" FROM (
SELECT CASE WHEN s1."code" IS NOT NULL AND s2."code" IS NULL AND s3."code" IS NULL
THEN s1."ident"||'|1'
WHEN s1."code" IS NOT NULL AND s2."code" IS NOT NULL AND s3."code" IS NULL
THEN s2."ident"||'|2'
WHEN s1."code" IS NOT NULL AND s2."code" IS NOT NULL AND s3."code" IS NOT NULL
THEN s3."ident"||'|3' END AS "identifier", s1."code"
FROM (select "ii"."fk", "ii"."scheme", "ii"."fk"||'|'||"ii"."scheme" AS "ident", "code"
from "inidentifier" "ii" group by "fk", "scheme", "code") s1
LEFT OUTER JOIN
(select "ii"."fk", "ii"."scheme", "ii"."fk"||'|'||"ii"."scheme" AS "ident", "code"
from "inidentifier" "ii" group by "fk", "scheme", "code") s2 ON s1."ident" = s2."ident"
AND s1."code" < s2."code"
LEFT OUTER JOIN
(select "ii"."fk", "ii"."scheme", "ii"."fk"||'|'||"ii"."scheme" AS "ident", "code"
from "inidentifier" "ii" group by "fk", "scheme", "code") s3 ON s1."ident" = s2."ident"
AND s2."ident" = s3."ident" AND s1."code" < s2."code" AND s2."code" < s3."code"
ORDER BY "identifier", s1."code") "cache"
WHERE "cache"."identifier" IS NOT NULL
我的问题是,它不会产生任何与A | 3月底,在示例数据上面应该有最后是23 | 2 | 2 9876和23 | 2 | 2 6666.不同的方法可能是?
预先感谢您
大卫
您正在使用哪个数据库? (MySQL,Oracle SQLServer等) – Andomar
以上任何一种,首选ANSI SQL,但是concat函数是杀手。使用H2进行测试。 – Olddave
你能详细说明(编辑问题)什么使记录成为同一组?我没有从这个例子中弄明白。 (在示例输出中id 8是否正确) –