我有一个长列表,大约有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)
我有一个长列表,大约有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)
您有几个选项,其中一个选项是我推荐的选项之一。
在数据库中像这样创建一个表:
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想要比较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是附加的键控查找,匹配也应该相对较快。
而不是创建一个表,你可以创建一个大的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被索引/键入,单个匹配可能会导致更快的查询,而不是与长列表的逗号分隔值匹配。这是一个猜测。您必须查看查询计划并针对测试用例运行它。
测试这些选项应该很快。我建议使用数据库引擎和表的大小尝试所有这些选项,并查看哪一个最适合您的用例。
第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:不要从最后的值删除逗号。
虽然这会起作用(至少在大多数数据库中),但如果在OP中提到的超过5000个项目处于“入”状态,则会导致执行速度非常慢。 – user2366842
如果您临时将这些表加载到表中,然后对现有表进行内部连接,那么这将是最好的。只要你有正确的索引,我期望性能会更快,而不是做'ID(数千个值)' – zedfoxus
不确定你使用的是哪个版本的SQL,但是在Firebird 2.5中,我发现查询失败if “in”子句中有超过1500个值。 – Eric
有几种方法可以将文件导入表/临时表: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