T-SQL:从表中选择*,其中列在(…)中,具有重复项,而不使用union all
我在Excel中有一个数据集,其中有几千个id。在数据库中,我需要一些列来匹配这些ID,但有些ID在Excel列表中列出了两次(它们需要在那里出现两次)。我试图用IN语句编写查询,但它会自动过滤重复项。但是我也需要副本,否则我需要手动重新安排Excel和SQL结果之间的数据合并 有没有办法做类似的事情T-SQL:从表中选择*,其中列在(…)中,具有重复项,而不使用union all,sql,sql-server,tsql,duplicates,Sql,Sql Server,Tsql,Duplicates,我在Excel中有一个数据集,其中有几千个id。在数据库中,我需要一些列来匹配这些ID,但有些ID在Excel列表中列出了两次(它们需要在那里出现两次)。我试图用IN语句编写查询,但它会自动过滤重复项。但是我也需要副本,否则我需要手动重新安排Excel和SQL结果之间的数据合并 有没有办法做类似的事情 SELECT * FROM table WHERE id IN ( .. list of thousands ids ) 要在不使用UNION ALL(联合所有)的情况下获取副本,以防止向数据
SELECT *
FROM table
WHERE id IN (
.. list of thousands ids
)
要在不使用UNION ALL(联合所有)的情况下获取副本,以防止向数据库触发数千个单独的查询?如果要保留副本,需要使用
左连接。如果订购很重要,那么您也应该包括该信息
这里有一种方法:
select t.*
from (values (1, id1), (2, id2), . . .
) ids(ordering, id) left join
table t
on t.id = ids.id
order by ids.ordering;
另一种方法是将ID加载到具有标识列的临时表中,以捕获排序:
# Create the table
create table #ids (
ordering int identity(1, 1) primary key,
id
);
# Insert the ids
insert into #ids (id)
select @id;
# Use them in the query
select t.*
from #ids ids left join
table t
on t.id = ids.id
order by ids.ordering;
如果我理解正确,这正是
中的的工作方式
DECLARE @tbl TABLE(value INT, content VARCHAR(100));
WITH RunningNummber AS
(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nmbr
FROM sys.objects
)
INSERT INTO @tbl
SELECT Nmbr,'Content for ' + CAST(Nmbr AS VARCHAR(100))
FROM RunningNummber;
--This ...
SELECT * FROM @tbl WHERE value IN(1,3,5);
-- ... is the same as this:
SELECT * FROM @tbl WHERE value IN(1,1,1,1,3,3,5,1,3,5);
如果你想合并两个结果集,你必须将它们连接起来……在我看来,我认为最好是在一个表中导入与数千个ID列表相对应的值,然后应用子查询来获得你需要的信息
即使在获得目标表中的所有ID时,您也可以使用T-SQL进行筛选,以删除重复的值,避免将来出现任何问题。您的意思是“数千个ID列表”中有重复的ID吗?输入列表中的重复项无关紧要。还是有重复的表格?普通选择将删除nu重复项。同一id将在
-列表中的中列出两次(几百个id)。SQLServer似乎认为,好吧;我以前做过,不必再做了。所以,在某个时刻,重复的内容会从查询结果中删除。嗨,本,这仍然是打开的吗?你需要进一步的帮助吗?嗨@Shnugo,谢谢你提醒我。我已经使用一个小PHP脚本来创建一个将结果联合在一起的大型查询,从而修复了这个问题。基于这些解决方案,我这样做更快。谢谢。遗憾的是,我没有对表的写入权限(事实上,我很高兴,因为这是一个生产环境),所以创建表是不可行的。另外,我使用的是SQL 2005数据库(可能应该提到这一点),我很难使用values()语法。此外,这还包括在SQL查询中进行大量手动重写,以将所有ID拆分为单独的值组。谢谢你。@Ben。您可以使用选择,而不是值()。联合所有选择。union all select
。感谢您的回复。那确实会达到我的目的。我使用一个小的PHP脚本和CSV文件以及我需要的ID创建了一个类似这样的大型查询。谢谢,我接受你的回答,+1