Intereting Posts
R эквивалент SELECT DISTINCT для двух или более полей / переменных Диапазон времени разделения, основанный на действиях в sql Какие тэги нет в базе данных? Загрузка огромных SQL-файлов MYSQL | Скорость MyISAM внезапно замедляется для вложений (странная проблема) удалить все из таблицы PostgreSQL: Полнотекстовый поиск – как искать частичные слова? удалить мин. значения из записей после сравнения двух значений из таблицы в sql Найдите не дублированные записи, за исключением нулей, на основе одного поля. Parallel.Foreach loop, создающий несколько соединений db, вызывает ошибки соединения? CREATE TABLE обратное проектирование в Oracle MySql: установить лимит для дубликата столбца Нужна помощь для выполнения вычисления ниже Попытка организовать SQL-запрос для правильного использования DATEDIFF () Рекомендации по многопоточной обработке записей в базе данных Как разделить содержимое ячейки и извлечь информацию в новый столбец в инструкции выбора SQL?

Как выбрать подмножество результатов из оператора select

У меня есть таблица, в которой хранятся тройки RDF:

тройки (triple_id, sub_id, pre_id, obj_id)

Метод (мне нужно написать) получит массив чисел, который соответствует значениям pre_id. Я хочу выбрать все значения sub_id, у которых есть соответствующий pre_id для всех pre_ids в массиве, который передается.

Например, если у меня было одно значение pre_id, переданное в … позволяет вызвать значение, переданное в preId, я бы сделал:

выберите sub_id из троек, где pre_id = preId;

Однако, поскольку у меня есть mutliple значения pre_id, я хочу продолжать итерацию через значения pre_id и сохранять значения sub_id, соответствующие «тройным» записям, которые имеют оба.

Например, есть пять записей:

triples(1, 34,65,23) triples(2, 31,35,28) triples(3, 32,32,19) triples(4, 12,65,28) triples(5, 76,32,34) 

Если я передаю массив значений pre_id [65,32], то я хочу выбрать первую, третью, четвертую и пятую записи.

Что бы я сделал для этого?

Это может не работать с каждой базой данных, но ключевое слово in может сделать это:

 select sub_id from triples where pre_id in (65, 32) 

Вы принимаете входящие данные как одну строку, разделяете ее по разделителю и помещаете в @Table и используете JOIN , EXISTS или sub query чтобы получить нужные строки.

Вот как разбить строку на @Table

T-SQL: против конкатенации строк – как разбить строку на несколько записей

Полностью рабочий образец в SQL 2008

 DROP FUNCTION dbo.Split go CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(8000)) RETURNS table AS RETURN ( WITH Pieces(pn, start, stop) AS ( SELECT 1, 1, CHARINDEX(@sep, @s) UNION ALL SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) FROM Pieces WHERE stop > 0 ) SELECT pn, SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s FROM Pieces ) GO Declare @Triples Table ( triple_id Int, sub_id VarChar (10), pre_id VarChar (10), obj_id VarChar (10) ) INSERT INTO @Triples VALUES (1, 34,65,23), (2, 31,35,28), (3, 32,32,19), (4, 12,65,28), (5, 76,32,34) SELECT * FROM @Triples Triples INNER JOIN dbo.split (',', '65,32') as InputValues ON Triples.pre_id = InputValues.S 

Вы можете использовать такой запрос.

выберите sub_id из троек, где pre_id IN (выберите pre_id из троек, где pre_id <= 65 AND pre_id => 32)