Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询:如果满足搜索条件,则应返回单个记录,否则返回多个记录_Sql_Oracle_Sql Tuning - Fatal编程技术网

SQL查询:如果满足搜索条件,则应返回单个记录,否则返回多个记录

SQL查询:如果满足搜索条件,则应返回单个记录,否则返回多个记录,sql,oracle,sql-tuning,Sql,Oracle,Sql Tuning,我有一个包含数十亿条记录的表,表结构如下: ID NUMBER PRIMARY KEY, MY_SEARCH_COLUMN NUMBER, “我的搜索”列的数值长度最多为15位 我想要的是,如果任何特定记录匹配,我只需要得到匹配的值 i、 e:如果我输入MY_SEARCH_COLUMN=123454321,并且表的值为123454321,则只应返回该值 但如果精确值不匹配,我将不得不从表中获取下10个值 i、 e:如果我输入MY_SEARCH_COLUMN=123454321,而COLUMN没

我有一个包含数十亿条记录的表,表结构如下:

ID NUMBER PRIMARY KEY,
MY_SEARCH_COLUMN NUMBER,
“我的搜索”列的数值长度最多为15位

我想要的是,如果任何特定记录匹配,我只需要得到匹配的值

i、 e:如果我输入MY_SEARCH_COLUMN=123454321,并且表的值为123454321,则只应返回该值

但如果精确值不匹配,我将不得不从表中获取下10个值

i、 e:如果我输入MY_SEARCH_COLUMN=123454321,而COLUMN没有值123454321,那么它应该从表中返回10个大于123454321的值


这两种情况都应该包含在单个SQL查询中,我必须记住查询的性能。我已经在“我的搜索”列上创建了索引,因此欢迎提出其他建议来提高性能。

如果不使用proc或某些动态SQL,这可能会很棘手,但我们可以尝试在此处使用行数:


上述查询的基本思想是,我们将一个行号分配给与目标匹配或更大的所有记录。然后,如果是精确匹配的,则使用1的行号进行查询;如果不匹配,则使用最多10的所有行号进行查询。

如果不使用proc或某些动态SQL,这可能会很棘手,但我们可以尝试在此处使用行号:

上述查询的基本思想是,我们将一个行号分配给与目标匹配或更大的所有记录。然后,如果是完全匹配的,则使用1的行号进行查询;如果不匹配,则使用最多10的所有行号进行查询。

选择* 作为src从您的_表中 其中src.MY_SEARCH_COLUMN=CASE WHEN EXISTS从_表中选择1作为src2 with nolock,其中src2.MY_SEARCH_COLUMN=123456321 然后是123456321 ELSE src.MY\u SEARCH\u列 结束

选择* 作为src从您的_表中 其中src.MY_SEARCH_COLUMN=CASE WHEN EXISTS从_表中选择1作为src2 with nolock,其中src2.MY_SEARCH_COLUMN=123456321 然后是123456321 ELSE src.MY\u SEARCH\u列
结束

谢谢@Tim,这正是我想要的。但我仍然面临着性能问题,我已经在专栏中列出了索引,我们可以做些什么来提高性能?我没有看到任何其他明显的方法来提高性能。你可以以我的回答为出发点提出一个新问题。这样,你会得到更多的关注。谢谢你@Tim,这正是我想要的。但我仍然面临着性能问题,我已经在专栏中列出了索引,我们可以做些什么来提高性能?我没有看到任何其他明显的方法来提高性能。你可以以我的回答为出发点提出一个新问题。这样,你会得到更多的关注。
WITH cte AS (
    SELECT ID, MY_SEARCH_COLUMN,
        ROW_NUMBER() OVER (ORDER BY MY_SEARCH_COLUMN) rn
    FROM yourTable
    WHERE MY_SEARCH_COLUMN >= 123454321
)

SELECT *
FROM cte
WHERE rn <= CASE WHEN EXISTS (SELECT 1 FROM yourTable WHERE MY_SEARCH_COLUMN = 123454321)
                THEN 1
                ELSE 10 END;