代码之家  ›  专栏  ›  技术社区  ›  Ben

T-SQL:从(…)中列重复的表中选择*,而不使用union all

  •  1
  • Ben  · 技术社区  · 10 年前

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

    有什么办法可以像这样做吗

    SELECT *
    FROM table
    WHERE id IN (
     .. list of thousands ids
    )
    

    也可以不使用 UNION ALL 以防止向数据库发出数千个单独的查询?

    3 回复  |  直到 10 年前
        1
  •  2
  •   Gordon Linoff    10 年前

    您需要使用 left join 如果你想保留副本。如果订购很重要,那么您也应该包括这些信息。

    这里有一种方法:

    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;
    
        2
  •  1
  •   Gottfried Lesigang    10 年前

    如果我理解正确的话,这就是正确的方法 IN 是应该工作的。。。

    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);
    

    如果你想合并两个结果集,你必须将它们连接起来。。。

        3
  •  0
  •   Geovanny -Gio- Hernandez    10 年前

    在我看来,我认为最好在表中导入与数千个id列表对应的值,并应用Subquery来获取所需的信息。

    即使在获得目标表中的所有id后,也可以使用T-SQL进行筛选,以删除重复值,避免将来出现任何问题。