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

时间:2016-03-21 10:30:56

标签: 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的情况下获取重复项,以防止向数据库发送数千个单独的查询?

3 个答案:

答案 0 :(得分:2)

如果要保留重复项,则需要使用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;

答案 1 :(得分:1)

如果我理解这一点,这正是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); 应该工作的方式......

<div class="form">
<?php
 $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(
    'id'=>'data-fixer-form',
    'enableAjaxValidation'=>true,
    'htmlOptions'=>array(
        'onsubmit'=>"return false;",/* Disable normal form submit */
        'onkeypress'=>" if(event.keyCode == 13){ ajaxReplaceValue(event); } " /* Do ajax call when user presses enter key */
    ),
));
?>
<?php echo $form->dropDownListControlGroup($model,'table_name',$tableNames,array('id'=>'table_name','onchange'=>'getColumn(event)','class'=>'span4')); ?>
<?php echo $form->dropDownListControlGroup($model,'column_name',$columnNames,array('id'=>'column_name','class'=>'span4')); ?>
<?php echo $form->textFieldControlGroup($model,'search_for',array('id'=>'search_for','placeholder'=>tTools('dataFixer','search_for'),'class'=>'span4')); ?>
<?php echo $form->textFieldControlGroup($model,'replace_with',array('id'=>'replace_with','placeholder'=>tTools('dataFixer','replace_with'),'class'=>'span4')); ?>
<div class="form-actions">
    <?php
     echo CHtml::submitButton(t('common','submit'), array (
        'id'=>'dataFixerSubmitBtn',
        'class'=>'btn btn-primary',
        'identity'=>'',
        'dataFetched'=>'0',
        'onclick'=>'ajaxReplaceValue(event);'
        ));
    ?>
</div>
<?php $this->endWidget(); ?>

如果你想要结合两个结果集,你必须加入它们......

答案 2 :(得分:0)

在我看来,我认为最好在表格中导入与千位ID列表对应的值,并应用子查询来获取您需要的信息。

即使您在目标表中获得了所有ID,也可以使用T-SQL进行过滤,以删除重复值并避免将来出现任何问题。