动态选择的firebird存储过程

fquxozlt  于 2021-07-24  发布在  Java
关注(0)|答案(0)|浏览(248)

我们正在使用Firebird2.5。我有以下结构。

TABLE ARTICLES(ARTNR INTEGER NOT NULL PRIMARY KEY
  , S1 INTEGER
  , S2 INTEGER ..... S10 INTEGER)

TABLE S1..S10(ID INTEGER NOT NULL PRIMARY KEY
  , DESCRIERE VARCHAR(40))

有来自的外键 CATALOGSx 对于目录中的所有10列。 ARTICLES.S1 有外键 S1.ID .

TABLE RAPORT_CLASIFICARE (
  ID             INTEGER NOT NULL PRIMARY KEY,
  IDOPERATOR     INTEGER NOT NULL,
  IDCLASA        INTEGER NOT NULL,
  VALUE_INTEGER  INTEGER NOT NULL
);

这个 RAPORT_CLASIFICARE 表用于存储 S1 .. S10 table(用户从界面中选择此选项) IDCLASA 是s_表的索引,例如1代表s1,2代表s2,依此类推。
用户可以选择一个或多个s的最大值是10。
用户选择的目标是'你选择一些'分类',结果是只有文章,累计对应的选择。
例如,我可以从s1 id[3,4,5]和s3[9,13,22]以及s7[1,2,3]中进行选择,结果必须是具有articles.s1 in(3,4,5)和articles.s3 in(9,13,22)以及articles.s7 in(1,2,3)的项目。
从代码(我们正在使用delphi)这是通过使用 LEFT JOIN ```
SELECT *
FROM ARTICLES A
LEFT JOIN RAPORT_CLASIFICARE RC_1 ON ((RC_1.IDOPERATOR = :AIDOPERATOR) AND (RC_1.IDCLASA = 1) AND (RC_1.VALUE_INTEGER = A.S1))
LEFT JOIN RAPORT_CLASIFICARE RC_3 ON ((RC_3.IDOPERATOR = :AIDOPERATOR) AND (RC_3.IDCLASA = 3) AND (RC_3.VALUE_INTEGER = A.S3))
WHERE A.ARTNR > 0
AND (RC_1.ID IS NOT NULL)
AND (RC_3.ID IS NOT NULL)

结果sql是可以的,但是我想创建一个存储过程来实现这一点。有办法吗?我已经找到一个解决办法,工作“正确”,但不可能使用,因为速度慢。所有列都被编入索引。我们避免使用in子句,因为它非常慢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题