条款不起作用

时间:2016-07-22 09:56:57

标签: sql oracle11g

我在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 条款不在此处 请仔细查看我的查询并指导我

1 个答案:

答案 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表。如果同一MJOC_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语法,查询就变得更具可读性。

建议的查询会选择子查询中WHEREJOC_FIN_CLTH_DFCT_LOT所需的所有列,这样您就不必再次包含这些表了。

主要技巧是使用JOC_FIN_CLTH_DFCT_MAIN窗口函数,该函数根据ROW_NUMBER子句给出序列号。然后外部查询仅过滤那些得到数字1的记录,这些记录的PARTITION值对于给定的FCD_MAIN_ID来说是最小的。