Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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
T-SQL:从表中选择*,其中列在(…)中,具有重复项,而不使用union all_Sql_Sql Server_Tsql_Duplicates - Fatal编程技术网

T-SQL:从表中选择*,其中列在(…)中,具有重复项,而不使用union all

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(联合所有)的情况下获取副本,以防止向数据

我在Excel中有一个数据集,其中有几千个id。在数据库中,我需要一些列来匹配这些ID,但有些ID在Excel列表中列出了两次(它们需要在那里出现两次)。我试图用IN语句编写查询,但它会自动过滤重复项。但是我也需要副本,否则我需要手动重新安排Excel和SQL结果之间的数据合并

有没有办法做类似的事情

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