Как запросить базу данных SQL для большого количества результатов, которые не имеют общих критериев? - PullRequest
2 голосов
/ 20 апреля 2009

У меня есть MS SQL DB с около 2600 записей (каждая информация о компьютере). Мне нужно написать оператор SELECT, который выбирает около 400 из этих записей.

Какой лучший способ сделать это, если у них нет общих критериев? Они просто разные случайные числа, поэтому я не могу использовать подстановочные знаки или что-то подобное. Должен ли я просто вручную включить все 400 чисел в запрос?

Ответы [ 9 ]

7 голосов
/ 20 апреля 2009

Если вам нужно 400 определенных строк, столбцы которых соответствуют определенному числу:

Да, включите все 400 номеров, используя предложение IN. По моему опыту (через профилирование кода) использование предложения IN быстрее, чем использование где column = A или column = B или ...

400 на самом деле не много.

SELECT * FROM table WHERE column in (12, 13, 93, 4, ... )

Если вам нужно 400 случайных строк:

SELECT TOP 400 * FROM table
ORDER BY NEWID()
4 голосов
/ 20 апреля 2009

Вместо того, чтобы выполнять несколько запросов или выбирать весь набор строк и фильтровать его самостоятельно, создайте временную таблицу или постоянную таблицу, в которую вы вставляете временные строки для каждого идентификатора. В вашем основном запросе просто join для вашей временной таблицы.

Например, если ваша исходная таблица ...

person:
    person_id
    name

И у вас есть 400 различных person_id, которые вы хотите, скажем, у нас есть постоянная таблица для наших временных рядов, как это ...

person_query:
   query_id
   person_id

Вы вставляете свои строки в person_query, а затем выполняете свой запрос следующим образом ..

select
    *

from person p

join person_query pq on pq.person_id = p.person_id

where pq.query_id = @query_id
2 голосов
/ 20 апреля 2009

Возможно, вы обнаружили недостаток в дизайне базы данных. То есть есть что-то общее среди 400 записей, которые вы хотите, и вам нужен еще один столбец в базе данных, чтобы показать эту общность. Затем вы можете выбрать этот новый столбец.

1 голос
/ 20 апреля 2009

Как сказал выше Брайан Бонди, использование оператора IN, вероятно, является лучшим способом

SELECT * FROM table WHERE column in (12, 13, 93, 4, ... )

Один хороший прием - вставить идентификаторы из электронной таблицы, если она у вас есть ...

Если идентификаторы нужных вам строк находятся в электронной таблице, то вы можете добавить в электронную таблицу дополнительный столбец, который ОБЪЕДИНЯЕТ () запятую к концу идентификатора, чтобы столбец в вашей электронной таблице выглядел следующим образом :

12,
13,
93,
4,

затем скопируйте и вставьте этот столбец данных в ваш запрос, чтобы он выглядел следующим образом:

SELECT * FROM table WHERE column in (
12, 
13, 
93, 
4, 
... 
)

Это не выглядит красиво, но это быстрый способ получить все цифры.

0 голосов
/ 20 апреля 2009

Просто выберите TOP n строк и упорядочите их по случайному порядку.

Ниже приведен гипотетический пример возврата 10 случайных имен сотрудников:

   SELECT TOP 10
     EMP.FIRST_NAME
    ,EMP.LAST_NAME
   FROM  
     Schema.dbo.Employees EMP
   ORDER BY
     NEWID()
0 голосов
/ 20 апреля 2009

Я бы построил отдельную таблицу с вашими критериями выбора, а затем соединил таблицы вместе или что-то в этом роде, предполагая, что ваши критерии статичны.

0 голосов
/ 20 апреля 2009

Вы можете создать таблицу с этими 400+ случайными токенами и выбрать их. например.,

SELECT * FROM inventory WHERE inventory_id IN (SELECT id FROM inventory_ids WHERE tag = 'foo')

Вам все еще нужно поддерживать другую таблицу, но, по крайней мере, у вас нет одного гинормального запроса.

0 голосов
/ 20 апреля 2009

Для этой конкретной ситуации (не обязательно общего решения) самой быстрой и простой вещью, вероятно, является чтение всей таблицы SQL в память и поиск совпадений в коде вашей программы, а не в том, чтобы база данных анализировала гигантское предложение where.

0 голосов
/ 20 апреля 2009

Вы можете создать список XML или что-то в этом роде, который бы отслеживал то, что вам нужно запросить, а затем вы могли бы написать запрос, который будет перебирать этот список, возвращая их все.

Здесь - это веб-сайт, на котором есть множество примеров выполнения того, что вы ищете, различными способами (# 4 - метод XML).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...