我在Excel中有一个数据集,我有几千个id。在数据库中,我需要几列来匹配这些ID,但有些ID在Excel列表中列出两次(并且它们需要在那里两次)。我试图用IN语句编写查询,但它会自动过滤重复项。但我也想要重复项,否则我需要手动重新排列Excel和SQL结果之间的数据合并。
有没有办法做类似
的事情SELECT *
FROM table
WHERE id IN (
.. list of thousands ids
)
还要在不使用UNION ALL
的情况下获取重复项,以防止向数据库发送数千个单独的查询?
答案 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进行过滤,以删除重复值并避免将来出现任何问题。