2017-09-27 57 views
1

我有一个长列表,大约有5000多个ID(数字)。SQL从哪里读取(长列表来自.TXT文件)

ID 
4 
5 
6 
9 
10 
14 
62 
63 
655 
656 
657 
658 
659 
661 
662 

我想知道如果有一个方法来调用从txt文件读取的ID,而不是在查询中输入的所有5000?

例如

SELECT count(*) from table where ID in (file1.txt) 
+3

如果您临时将这些表加载到表中,然后对现有表进行内部连接,那么这将是最好的。只要你有正确的索引,我期望性能会更快,而不是做'ID(数千个值)' – zedfoxus

+1

不确定你使用的是哪个版本的SQL,但是在Firebird 2.5中,我发现查询失败if “in”子句中有超过1500个值。 – Eric

+0

有几种方法可以将文件导入表/临时表:https://docs.microsoft.com/en-us/sql/relational-databases/blob/load-files-into-filetables https:// www.codeproject.com/Articles/290242/Import-Data-from-a-Text-or-CSV-file-into-SQL-Serve – NonProgrammer

回答

1

您有几个选项,其中一个选项是我推荐的选项之一。

选项1

在数据库中像这样创建一个表:

create table ID_Comparer (
    ID int primary key 
); 

与您所选择的编程语言,空出表,然后加载所需的5000+编号,最终在此表中查询。

然后,写其中一个查询,提取所需的数据:

select * 
from main_table m 
where exists (
    select 1 from ID_Comparer where ID = m.ID 
) 

select * 
from main_table m 
inner join ID_Comparer c on m.ID = c.ID 

由于ID_Comparer和(假设)MAIN_TABLE的ID被索引/键,匹配应该是相对较快。

选项1改性

这个选项就像上面的一个,但有助于一点并发。这意味着,如果应用程序1想要比较2000个ID,而应用程序2想要同时将5000个ID与主表进行比较,则不希望从比较器表中删除数据。所以,改变一下表格。

create table ID_Comparer (
    ID int primary key, 
    token char(32) unique, 
    entered date default current_date() -- use the syntax of your DB 
); 

然后,用你最喜欢的编程语言创建一个GUID。加载所有的ID和相同的GUID到表像这样:

1, 7089e5eced2f408eac8b390d2e891df5 
2, 7089e5eced2f408eac8b390d2e891df5 
... 

的另一种方法做同样的事情将是一个GUID

2412, 96d9d6aa6b8d49ada44af5a99e6edf56 
9434, 96d9d6aa6b8d49ada44af5a99e6edf56 
... 

加载其自身的ID现在,您的选择:

SELECT * FROM MAIN_TABLE米 其中存在

012( 从ID_Comparer其中ID = m.ID和令牌= '' 选1)

OR

SELECT * 从MAIN_TABLE米 内部联接上m.ID = c.ID ID_Comparer c和令牌= ''

您收到数据后,一定要做到delete from ID_Comparer where token = '<your guid>' - 这会只是很好的清理

你可以创建一个夜间任务来删除超过2天的所有数据或一些这样的额外家务。

由于ID_Comparer和(假设)main_table的ID已被索引/键入,即使GUID是附加的键控查找,匹配也应该相对较快。

选项2

而不是创建一个表,你可以创建一个大的SQL查询,像这样:

select * from main_table where id = <first id> 
union select * from main_table where id = <second id> 
union select * from main_table where id = <third id> 
... 

OR

select * from main_table where id IN (<first 5 ids>) 
union select * from main_table where id IN (<next 5 ids>) 
union select * from main_table where id IN (<next 5 ids>) 
... 

如果性能是可以接受的,如果创建如选项1中的新表格不适合您,您可以尝试其中一种方法。

(假设)main_table的ID被索引/键入,单个匹配可能会导致更快的查询,而不是与长列表的逗号分隔值匹配。这是一个猜测。您必须查看查询计划并针对测试用例运行它。

要选择哪个选项?

测试这些选项应该很快。我建议使用数据库引擎和表的大小尝试所有这些选项,并查看哪一个最适合您的用例。

0

第1步:复制在所有你的价值观升华或记事本+ 第2步:按Ctrl + H选择“正则表达式”选项 第3步:添加“”到最后

类型$在“查找内容”字段中, 和“替换为”字段中的“,”。然后点击“全部替换”。

然后简单地复制粘贴值在您的SQL查询

SELECT COUNT(*) FROM `admins` WHERE id in (4, 
5, 
6, 
9, 
10, 
14, 
62, 
63, 
655, 
656, 
657, 
658, 
659, 
661, 
662) 

PS:不要从最后的值删除逗号。

+1

虽然这会起作用(至少在大多数数据库中),但如果在OP中提到的超过5000个项目处于“入”状态,则会导致执行速度非常慢。 – user2366842