我在oracle 11g数据库中进行此查询
SELECT DISTINCT JOC_FIN_CLTH_DFCT_LOT.LOT_NO,
I.ISSUE_DATE,
R.PROC_DESC,
R.RECV_DATE,
M.DFCT_DATE,
JOC_FIN_CLTH_DFCT_LOT.FCD_MAIN_ID
FROM JOC_FIN_CLTH_DFCT_LOT,
JOC_FIN_CLTH_DFCT_MAIN M,
JOC_DAILY_FABRC_RECV_FOLD R,
JOC_LOT_ISSUE_REG I
WHERE M.FCD_MAIN_ID = JOC_FIN_CLTH_DFCT_LOT.FCD_MAIN_ID
AND R.LOT_NO = JOC_FIN_CLTH_DFCT_LOT.LOT_NO
AND I.LOT_NO = R.LOT_NO
AND I.LOT_YEAR = R.LOT_YEAR
AND JOC_FIN_CLTH_DFCT_LOT.LOT_YEAR = R.LOT_YEAR
AND JOC_FIN_CLTH_DFCT_LOT.LOT_YEAR = '1213'
AND JOC_FIN_CLTH_DFCT_LOT.FCDL_ID IN
( SELECT MIN (DFCT_LOT.FCDL_ID)
FROM JOC_FIN_CLTH_DFCT_LOT DFCT_LOT, JOC_FIN_CLTH_DFCT_MAIN DFT_MAIN
WHERE DFCT_LOT.FCD_MAIN_ID IN (DFT_MAIN.FCD_MAIN_ID)
GROUP BY DFCT_LOT.FCD_MAIN_ID)
ORDER BY JOC_FIN_CLTH_DFCT_LOT.FCD_MAIN_ID
它在2秒内检索数据没有。行= 5100 但是当我在我的前端应用程序中使用此查询时需要花费太多时间,因此在排除故障后我发现子查询导致数据检索时出现问题,因此我简化了此查询
SELECT DISTINCT DFCT_LOT.LOT_NO,
I.ISSUE_DATE,
R.PROC_DESC,
R.RECV_DATE,
M.DFCT_DATE,
DFCT_LOT.FCD_MAIN_ID
FROM JOC_FIN_CLTH_DFCT_LOT DFCT_LOT,
JOC_FIN_CLTH_DFCT_MAIN M,
JOC_DAILY_FABRC_RECV_FOLD R,
JOC_LOT_ISSUE_REG I,
JOC_FIN_CLTH_DFCT_MAIN DFT_MAIN
WHERE M.FCD_MAIN_ID = DFCT_LOT.FCD_MAIN_ID
AND R.LOT_NO = DFCT_LOT.LOT_NO
AND I.LOT_NO = R.LOT_NO
AND I.LOT_YEAR = R.LOT_YEAR
AND DFCT_LOT.LOT_YEAR = R.LOT_YEAR
AND DFCT_LOT.LOT_YEAR = '1213'
AND DFCT_LOT.FCD_MAIN_ID IN (DFT_MAIN.FCD_MAIN_ID)
GROUP BY DFCT_LOT.FCDL_ID,
DFCT_LOT.FCD_MAIN_ID,
DFCT_LOT.LOT_NO,
I.ISSUE_DATE,
R.PROC_DESC,
R.RECV_DATE,
M.DFCT_DATE,
DFCT_LOT.FCD_MAIN_ID
HAVING DFCT_LOT.FCDL_ID in MIN (DFCT_LOT.FCDL_ID)
ORDER BY DFCT_LOT.FCD_MAIN_ID
这是上述查询的简化形式,但行数增加 no.of rows = 5578但我知道实际没有。行= 5100 条款不在此处 请仔细查看我的查询并指导我
答案 0 :(得分:1)
在您的第二个查询中,您第二次加入表格import React, { Component } from 'react';
import {
AppRegistry,
ListView,
StyleSheet,
Text,
View
} from 'react-native';
class SimpleList extends Component {
constructor(props) {
super(props);
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {
dataSource: ds.cloneWithRows(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
};
}
_renderRow(rowData) {
return <Text style={styles.row}>{rowData}</Text>
}
render() {
return (<View style={styles.container}>
<ListView
dataSource={this.state.dataSource}
renderRow={(e) => this._renderRow(e)}/>
</View>);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF'
},
row: {
flex: 1,
fontSize: 24,
padding: 42,
borderWidth: 1,
borderColor: '#DDDDDD'
}
});
export default SimpleList;
,一次加入JOC_FIN_CLTH_DFCT_MAIN
,一次加入M
。在第二个查询的DFCT_LOT
列表中,您可以从SELECT
获取第一列,从M
获取最后一列。
但是在第一个查询中,它们都来自同一个DFCT_LOT
表。如果同一M
在JOC_FIN_CLTH_DFCT_MAIN
中有多条记录,那么这将在第二个查询中产生更多组合,这就解释了为什么您有更多结果。
但还有其他一些差异。在第二个查询中,您分组的列数多于第一个列。此外,FCD_MAIN_ID
在第二个查询中没有任何意义,因为它已经被分组,因此它与MIN (DFCT_LOT.FCDL_ID)
完全相同。因此,DFCT_LOT.FCDL_ID
条款只是一个简单的重言式,您也可以将其排除在外,并且仍能获得相同的结果。
如果你确定第一个查询给出了你想要的结果,那么我会建议一种不同的方法来实现它的可能优化:
HAVING
请注意,我已经使用ANSI / ISO语法进行连接,我强烈建议您这样做。在SELECT DISTINCT
L.LOT_NO,
I.ISSUE_DATE,
R.PROC_DESC,
R.RECV_DATE,
L.DFCT_DATE,
L.FCD_MAIN_ID,
FROM (SELECT L.FCD_MAIN_ID,
L.LOT_NO,
L.LOT_YEAR,
M.DFCT_DATE,
ROW_NUMBER() OVER (PARTITION BY L.FCD_MAIN_ID
ORDER BY L.FCDL_ID) AS RN
FROM JOC_FIN_CLTH_DFCT_LOT L,
INNER JOIN JOC_FIN_CLTH_DFCT_MAIN M
ON M.FCD_MAIN_ID = L.FCD_MAIN_ID
) L
INNER JOIN JOC_DAILY_FABRC_RECV_FOLD R
ON R.LOT_NO = L.LOT_NO
AND R.LOT_YEAR = L.LOT_YEAR
INNER JOIN JOC_LOT_ISSUE_REG I
ON I.LOT_NO = R.LOT_NO
AND I.LOT_YEAR = R.LOT_YEAR
WHERE L.LOT_YEAR = '1213'
AND L.RN = 1
ORDER BY L.FCD_MAIN_ID
子句中定义连接条件是八十年代的事情;不要这样做。一旦习惯了ANSI / ISO语法,查询就变得更具可读性。
建议的查询会选择子查询中WHERE
和JOC_FIN_CLTH_DFCT_LOT
所需的所有列,这样您就不必再次包含这些表了。
主要技巧是使用JOC_FIN_CLTH_DFCT_MAIN
窗口函数,该函数根据ROW_NUMBER
子句给出序列号。然后外部查询仅过滤那些得到数字1的记录,这些记录的PARTITION
值对于给定的FCD_MAIN_ID
来说是最小的。