SQL 读取 Where IN(来自 .TXT 文件的长列表)
SQL Read Where IN (Long List from .TXT file)
我有一长串大约 5000 多个 ID(号码)。
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)
第 1 步:在 sublime 或 notepad++ 中复制所有值
第 2 步:按 ctrl+h 选择 "Regular expressions" 选项
第 3 步:要在每行末尾添加“,”,
在 "Find what" 字段中输入 $
,
和 "Replace with" 字段中的“,”。然后点击 "Replace All".
然后只需将值复制粘贴到您的 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
像这样在您的数据库中创建一个 table:
create table ID_Comparer (
ID int primary key
);
使用您选择的编程语言,清空table,然后在此table.
中加载您最终要查询的5000+个ID
然后,编写以下查询之一来提取您想要的数据:
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是indexed/keyed,所以匹配应该比较快。
选项 1 已修改
此选项与上面的选项类似,但对并发性有所帮助。这意味着,如果应用程序 1 想要比较 2000 个 ID,而应用程序 2 希望同时将 5000 个 ID 与您的主 table 进行比较,您不希望从比较器 table 中删除数据。所以,稍微改变一下 table。
create table ID_Comparer (
ID int primary key,
token char(32), -- index this
entered date default current_date() -- use the syntax of your DB
);
然后,使用您喜欢的编程语言创建 GUID。将所有 ID 和相同的 GUID 加载到 table 中,如下所示:
1, 7089e5eced2f408eac8b390d2e891df5
2, 7089e5eced2f408eac8b390d2e891df5
...
另一个做同样事情的进程将用 GUID 加载它自己的 ID
2412, 96d9d6aa6b8d49ada44af5a99e6edf56
9434, 96d9d6aa6b8d49ada44af5a99e6edf56
...
现在,你的 select:
select *
from main_table m
where exists (
select 1 from ID_Comparer where ID = m.ID and token = '<your guid>'
)
或
select *
from main_table m
inner join ID_Comparer c on m.ID = c.ID and token = '<your guid>'
收到数据后,请务必执行 delete from ID_Comparer where token = '<your guid>'
- 这样清理工作会很好
您可以创建一个夜间任务来删除所有超过 2 天的数据或一些类似的数据以进行额外的管理。
因为 ID_Comparer 和(假设)main_table 的 ID 是 indexed/keyed,即使 GUID 是额外的键控查找,匹配也应该相对较快。
选项 2
您可以像这样创建大型 SQL 查询,而不是创建 table:
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>
...
或
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>)
...
如果性能是可接受的table,并且如果像选项 1 中那样创建一个新的 table 对您来说不合适,您可以尝试其中一种方法。
(假设)main_table 的 ID 是 indexed/keyed,单独匹配可能会导致更快的查询,而不是匹配一长串逗号分隔值。那是一个猜测。您必须查看查询计划并 运行 它针对测试用例。
选择哪个选项?
测试这些选项应该很快。我建议使用您的数据库引擎和 table 的大小尝试所有这些选项,然后看看哪个最适合您的用例。
简单回答(PostgreSQL,Ubuntu 16.04):
假设您有一个 table userdogs
,其中有许多用户和他们的狗的名字:
userdogs:
id user dog
你还有一个文件 friendsfile.txt
,里面有你朋友的名字。你只想 select 你来自 table userdogs
的朋友。
friendsfile.txt:
Emily
John
Bill
Charlie
Cameron
1。创建一个新的 table 并从文件中插入内容:
CREATE TABLE friends (name varchar(200));
COPY friends
FROM '/home/friendsfile.txt'
WITH DELIMITER '~';
如果文件看起来像这样:
Emily/John/Bill/Charlie/Cameron
像这样的东西应该可以工作(未经测试,我的情况是换行):
COPY friends
FROM '/home/friendsfile.txt'
WITH DELIMITER('|');
2.
然后你去 select 他们:
SELECT DISTINCT user, dog FROM userdogs
WHERE (SELECT COUNT(*)
FROM friends
WHERE friends.name=userdogs.user)>0;
我有一长串大约 5000 多个 ID(号码)。
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)
第 1 步:在 sublime 或 notepad++ 中复制所有值 第 2 步:按 ctrl+h 选择 "Regular expressions" 选项 第 3 步:要在每行末尾添加“,”,
在 "Find what" 字段中输入 $
,
和 "Replace with" 字段中的“,”。然后点击 "Replace All".
然后只需将值复制粘贴到您的 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
像这样在您的数据库中创建一个 table:
create table ID_Comparer (
ID int primary key
);
使用您选择的编程语言,清空table,然后在此table.
中加载您最终要查询的5000+个ID然后,编写以下查询之一来提取您想要的数据:
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是indexed/keyed,所以匹配应该比较快。
选项 1 已修改
此选项与上面的选项类似,但对并发性有所帮助。这意味着,如果应用程序 1 想要比较 2000 个 ID,而应用程序 2 希望同时将 5000 个 ID 与您的主 table 进行比较,您不希望从比较器 table 中删除数据。所以,稍微改变一下 table。
create table ID_Comparer (
ID int primary key,
token char(32), -- index this
entered date default current_date() -- use the syntax of your DB
);
然后,使用您喜欢的编程语言创建 GUID。将所有 ID 和相同的 GUID 加载到 table 中,如下所示:
1, 7089e5eced2f408eac8b390d2e891df5
2, 7089e5eced2f408eac8b390d2e891df5
...
另一个做同样事情的进程将用 GUID 加载它自己的 ID
2412, 96d9d6aa6b8d49ada44af5a99e6edf56
9434, 96d9d6aa6b8d49ada44af5a99e6edf56
...
现在,你的 select:
select *
from main_table m
where exists (
select 1 from ID_Comparer where ID = m.ID and token = '<your guid>'
)
或
select *
from main_table m
inner join ID_Comparer c on m.ID = c.ID and token = '<your guid>'
收到数据后,请务必执行 delete from ID_Comparer where token = '<your guid>'
- 这样清理工作会很好
您可以创建一个夜间任务来删除所有超过 2 天的数据或一些类似的数据以进行额外的管理。
因为 ID_Comparer 和(假设)main_table 的 ID 是 indexed/keyed,即使 GUID 是额外的键控查找,匹配也应该相对较快。
选项 2
您可以像这样创建大型 SQL 查询,而不是创建 table:
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>
...
或
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>)
...
如果性能是可接受的table,并且如果像选项 1 中那样创建一个新的 table 对您来说不合适,您可以尝试其中一种方法。
(假设)main_table 的 ID 是 indexed/keyed,单独匹配可能会导致更快的查询,而不是匹配一长串逗号分隔值。那是一个猜测。您必须查看查询计划并 运行 它针对测试用例。
选择哪个选项?
测试这些选项应该很快。我建议使用您的数据库引擎和 table 的大小尝试所有这些选项,然后看看哪个最适合您的用例。
简单回答(PostgreSQL,Ubuntu 16.04):
假设您有一个 table userdogs
,其中有许多用户和他们的狗的名字:
userdogs:
id user dog
你还有一个文件 friendsfile.txt
,里面有你朋友的名字。你只想 select 你来自 table userdogs
的朋友。
friendsfile.txt:
Emily
John
Bill
Charlie
Cameron
1。创建一个新的 table 并从文件中插入内容:
CREATE TABLE friends (name varchar(200));
COPY friends
FROM '/home/friendsfile.txt'
WITH DELIMITER '~';
如果文件看起来像这样:
Emily/John/Bill/Charlie/Cameron
像这样的东西应该可以工作(未经测试,我的情况是换行):
COPY friends
FROM '/home/friendsfile.txt'
WITH DELIMITER('|');
2.
然后你去 select 他们:
SELECT DISTINCT user, dog FROM userdogs
WHERE (SELECT COUNT(*)
FROM friends
WHERE friends.name=userdogs.user)>0;