SQL从另一个SQL查询中选择特定值

时间:2016-05-10 14:15:03

标签: sql

“F4111”是一个包含详细订单的表,其中输出“SU”订单类型,输入“OU”订单类型。所有“SU”订单都与一个特定的“OU”订单相关,因此所有SU和OU订单的总和应为零。他们的关系由他们的身份证明。如果SU orderID是1000,那么它的OU相关orderID是1001.我有一个SQL查询,它给了我一些特定的SU订单

TelephoneBookList * commandLoad(char* fileName) {
    TelephoneBookList *(*createList)(TelephoneBookNode*, char[]) = createTelephoneBookList;

    char entry[100];
    TelephoneBookList* aList = NULL;
    TelephoneBookNode* aNode = NULL;
    FILE* telephoneListFile = NULL;

    telephoneListFile = fopen(fileName, "r");

    if (!telephoneListFile)
        return NULL;
    else {
        while (!feof(telephoneListFile)) {
            fgets(entry, 100, telephoneListFile);

            if (strstr(entry, "#")) //skip the first 2 lines in text file
                continue;

            aList = (*createList)(aNode, entry); //call the below function
            countEntry++;
        }

    aList->size = countEntry;
    fclose(telephoneListFile);

    return aList;
    }
}

现在我需要另一个查询,它给我所有与特定SU订单相关的OU订单,所以我这样做了:

SELECT F4111.orderID FROM F4111 F4111
WHERE F4111.orderDATE='2016/05/09' AND F4111.orderTYPE='SU' AND F4111.orderDESTINY='333333'

但这很慢。 N个单独的查询更快,其中N是第一个查询中给出的唯一SU ID的数量。

知道怎么做得更快吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果不知道这是什么类型的数据库,桌子上有什么索引以及行数,就很难猜到。但是,让我抛出一些建议。

  1. 确保子查询SELECT F4111.orderID+1 ...速度很快。如果没有,则查看数据库的查询执行计划以查看花费的时间。您可能需要索引orderDATE列。如果orderTYPE单独编入索引,您可能希望删除该列或将另一列添加到索引以提高其基数。

  2. 如果子查询不是问题那么事情有点模糊,因为最简单的解释也是最不可能的:orderID上没有索引或者数据库查询引擎正在选择不要使用该索引。值得一试。再次,学习如何查看数据库的查询执行计划将帮助您查明问题。

  3. 将查询重写为使用内部联接而不是IN (SELECT ...)会很简单,但没有特别的理由期望这样做有所帮助。不过,你可以尝试一下。如果它有效,那么值得花时间比较它和原始SQL的执行计划。

  4. (您可能已经感受到这些建议的反复出现的主题。)

    1. 随着时间的推移,数据或索引可能会变得不健康;有关碎片和索引调整等主题,请参阅数据库供应商的文档。但这不太可能是问题,它通常留给DBA来检测和诊断这些问题。