2013-05-15 4 views
2

Просто быстрый вопрос. Я использую отдельные значения вручную занесены пользователем, и делает SQL-запрос по сравнению с двумя колонками, как:Использование IN с несколькими столбцами

SELECT col3,col1,col4 FROM table WHERE 
col1='SomeReallyLongText' OR col2='SomeReallyLongText' 

Повторение SomeReallyLongText терпима, но моя программа также поддерживает зацикливание через документ Excel с несколькими сотнями строки - это означает, что я буду делать:

SELECT col3,col1,col4 FROM table WHERE 
col1 IN('item1','item2',...'itemN') OR col2 IN('item1','item2',...'itemN') 

И запрос будет исчерпывающе долго, что я не могу себе представить, является эффективным. Есть ли способ сократить этот, так что два столбца можно сравнить с тем же набором IN (xxx)?

Если нет, существуют ли другие (более эффективные) способы предоставления набора значений в запросе?

(я использую C# с .NET 4.0 Client Profile, с помощью Excel Interop, чтобы получить доступ к файлу)

+0

Вы можете использовать таблицу значного параметр для передачи массивов вещей, а не только с 'DataTable's и хранимыми процедурами HTTP://www.mssqltips.com/sqlservertip/2112/table-value-parameters-in-sql-server-2008-and-net-c/ –

ответ

3

Я не слишком уверен в производительности вы получите с этим:

SELECT col3,col1,col4 FROM table 
WHERE EXISTS (
    SELECT 1 
    FROM (VALUES 
     ('item1') 
     , ('item2') 
     , ... 
     , ('itemN') 
    ) AS It(m) 
    WHERE It.m IN (col1, col2, ...) 
) 
+0

может быть уменьшена, возможно, до значения VALUES (('a'), ('b'), ('c') ... ('n')) ', возможно, для чего-то вроде" VALUES ('a', 'b », 'с' ... 'п')'? – Whoop5

+0

Это не то же самое, что и при таком подходе. – Serge

+0

Выбрал свой ответ, поскольку он не предполагает создание новой таблицы на сервере. – Whoop5

1

Вы можете создать временную таблицу для хранения всех значений, используемых в предложении IN

IF OBJECT_ID('tempdb..#Sample') IS NOT NULL DROP TABLE #Sample 

Create table #Sample 
(name varchar(20)) 

Insert into #Sample 
values 
('item1'),('Item2'),.... 

SELECT col3,col1,col4 FROM table WHERE 
col1 IN (Select name from #Sample) OR col2 IN(Select name from #Sample) 

или если вы используете Linq to SQL, то вы можете хранить данные первенствовать в коллекции и использовать Contains метод для запроса DB

var excelVal = new string[] { 'item1','item2'... }; 
var result = from x in Table 
      where excelVal .Contains(x.Col1) || excelVal.Contains(x.Col2) 
      select x; 
+0

Попробуйте выполнить первые 3 строки дважды в одном сеансе. Вы получите «В базе данных уже есть объект с именем« #Sample ». ошибка – Raj

Смежные вопросы