在DB2 / AS400上使用Views和CTE

时间:2018-10-11 14:41:43

标签: db2 ibm-midrange rpgle

一个通用问题。

我有一个雇员表({{​​1}}),其中包含新雇员数据和旧雇员数据。有一个名为EMPMAST的标志,如果他/她是当前雇员则为'Y'。 现在,我必须在SQLRPGLE中选择仅包含当前记录以及其他一些条件的记录(例如Current? ='SAM')。处理它的最佳方法是什么。 (根据性能和系统使用情况)

  1. 使用EMPNAME ='Y'在EMPMAST上创建视图。然后在其他条件下在程序中使用它。
  2. 在程序中使用条件为Current? ='Y'的CTE(带有AS)并使用它。
  3. 不使用CTE和View即可直接使用表
  4. 其他任何选择

2 个答案:

答案 0 :(得分:1)

选项1、2和3都将执行相同的操作。他们可能都具有相同的优化查询和访问计划。

答案 1 :(得分:1)

CTEView是两回事。 View适用于要在多个位置使用的查询,CTE仅在定义它的查询中可用。我通常不使用CTE来代替复杂的子查询。在您的情况下,条件足够简单,可以包含在where子句中,因此我认为无需引入其他复杂性。

有些人会告诉您不要在程序中直接查询表,而要始终使用视图。这样,您就可以在程序和数据库之间添加额外的隔离层,并且仍然可以使用ExtName定义记录结构,并且不必担心对表的更改,除非它们影响视图本身。在这种情况下,您可能会对使用该表的每个程序都有一个专用视图。

我倾向于只使用这些技术的混合体。我根据情况查询表,CTE或视图,并在程序中显式定义我的记录结构。我更喜欢只查询表,但是如果我有一些程序独有的复杂查询逻辑,我将使用CTE。我确实有一些视图,但是这些视图仅限于在多个程序中发生的查询,在这些程序中,我想确保一致地应用相同的逻辑。