左外连接与单个查询DB2

时间:2014-09-02 09:44:46

标签: sql db2 mainframe

我正在使用Mainframe Db2。它是一个患者数据库。我的要求是从3个表,TABACC,TABPAY和TABINS中获取不同的信息。 TABACC将始终为患者排队,但TABPAY和TABINS可能会或可能没有系统中的患者。

哪个效率更高,TABACC上的QUERY,LEFT OUTER JOIN到TABPAY和TABINS 或三个不同的查询,每个TABACC,TABPAY和TABINS一个。

3 个答案:

答案 0 :(得分:0)

你可以简单地说。如果没有找到行,TB3,TB4将返回NULL

SELECT TB1.COL1,
       TB2.COL4, 
       TB3.COL5, 
       TB4.COL6
FROM TB1 JOIN TB2 ON TB1.KEY = TB2.KEY
LEFT OUTER JOIN TB3 ON TB1.KEY = TB3.KEY
LEFT OUTER JOIN TB4 ON TB1.KEY = TB4.KEY;

答案 1 :(得分:0)

如果您要加入的列被编入索引,那么这是更有效的方法。

答案 2 :(得分:0)

取决于。

如果您所做的只是从三个表中撤回1行数据,那么很难击败COBOL的随机读取。只需要更少的开销。 SQL并不神奇。

但你提到写出一个文件。因此,假设您从这些文件中撤回100,1,000或甚至数百万行并将其输出到新文件。

而不是逐行工作,这是COBOL唯一的选项,在使用SQL时经常使用。您可以使用SQL

中的整个集合
insert into newtable 
  (SELECT TB1.COL1,
          TB2.COL4, 
          TB3.COL5, 
          TB4.COL6
  FROM TB1 JOIN TB2 ON TB1.KEY = TB2.KEY
  LEFT OUTER JOIN TB3 ON TB1.KEY = TB3.KEY
  LEFT OUTER JOIN TB4 ON TB1.KEY = TB4.KEY)

现在SQL解决方案应该更快,更快。

SQL的关键是集合思考。如果你是逐行做某事(也就是使用光标),你可能(但并不总是)做错了。

您不能简单地从COBOL的本机I / O更改为SQL,并期望获得更好的性能。实际上会更糟。

最后,考虑输出文件的用途。如果您要将数据导出到外部系统,那么您已经完成了很多工作。但如果您正在为另一个COBOL程序编写工作文件来处理......那么您可能有机会获得更多改进。查看整个过程,考虑整体上做了什么以及基于集合的SQL解决方案如何做到这一点。