2013-12-10 5 views
0

У меня есть запрос SQL, возвращающий результаты на основе предложения where.SQL Server: Nested Select Query

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

Мой выбор возвращает строки с идентификаторами, которые соответствуют критериям. Случается, что в таблице больше строк с этим идентификатором, но это не соответствует исходным критериям. Вместо того, чтобы повторно запрашивать БД отдельным вызовом, я хотел бы использовать один оператор select, чтобы также получить эти дополнительные строки с тем же идентификатором. ID не является индексом/идентификатором. Это соглашение об именах, которое я использую здесь.

Псевдо: (два шага)

1: select * from table where condition=xxx 

2: for each row returned, (select * from table where id=row.id) 

Я хочу сделать:

select 
    id as thisID, field1, field2, 
    (select id, field1, field2 from table where id = thisID) 
from 
    table 
where 
    condition=xxx 

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

Только одно выражение может быть указано в списке выбора, когда подзапрос не вводится с EXISTS. Недопустимое имя столбца 'thisID'

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

Пример:

ТАБЛИЦА

select * from table where col3 = 'green' 

id, col1, col2, col3 

123 | blue | red | green 
------------------------- 
567 | blue | red | green 
------------------------- 
123 | blue | red | blue 
------------------------- 
890 | blue | red | green 
------------------------- 

Я хочу, чтобы вернуть все 4 строки, потому что, хотя row 3 не проходит, когда условие, оно имеет ту же col1 значение как row 1 (123), и я необходимо включить его, поскольку он является частью «набора», который мне нужно найти/импортировать, вызванного/ссылающегося на id=123.

То, что я делаю вручную сейчас, получает строку 1, а затем запускает другой запрос на основе идентификатора строки 1, чтобы получить строку 3.

+0

... хорошо, можете ли вы дать нам образцы данных? У вас есть уникальный идентификатор для каждой строки (идентификаторы не обязательно должны быть уникальными? Если соответствующие подписи также отображаются из подзапроса? Что происходит, если несколько строк с одним и тем же ключом - должны ли они сообщаться подзапросом, но перечислены с другой строкой (уникальный уникальный идентификатор)? Для получения наилучших результатов, пожалуйста, отправьте как можно более полный запрос (анонимное, если вам нужно). –

+0

Привет @ Clockwork-Muse, запрос имеет 5 объединений и много, много полей ... Я «импортирую» данные из старой системы в качестве приложения к новой системе, которую мы разрабатываем. Я добавлю еще несколько деталей. На данный момент я пошел вперед и просто запросил каждую начальную строку, так как мне нужно сделайте некоторый прогресс, но я бы хотел, чтобы вышеупомянутое работало для будущей справки. –

+0

Это прекрасно, но если вы не сообщите нам, что вы ожидаете от данных, когда вы закончите (в отношении общих значений, скопированных), мы можем «Мне очень приятно помочь». Черт возьми, вы можете быть удивлены результатами ... –

ответ

0

Вы можете использовать Where IN

select id as thisID, field1, field2 from table 
where id in 
(select id from table where condition=xxx) 
+0

Это похоже на то, что хочет OP - он хочет показать критерии соответствия для каждой строки. –

+0

Я думаю, что это так. OP 'кажется' хочет получить всю информацию обо всех идентификаторах, входящих в категорию «Зеленый» – Schalk

0

Попробуйте

Пусть говорят, что вы таблицы ниже и называется #Temp

Id Col1 Col2 Col3 
123 blue red  green 
567 blue red  green 
123 blue red  blue 
890 blue red  green 

получит id к временной таблице

Create Table #T1(Id int) 
Insert Into #T1 
Select Id 
From #Temp 
Where Col3='green' 

Тогда

Select distinct * 
From #Temp 
Where Id in (select Id from #T1) Or Col3='Green' 

Какой результат все строки из главной таблицы

Update

Если вы хотите использовать так, как вы сейчас используете, попробовать что-то вроде ниже

select 
    id as thisID, field1, field2, 
    (select top 1 id from table where id = t.id) as Id, 
    (select top 1 field1 from table where id = t.id) as field1, 
    (select top 1 field2 from table where id = t.id) as field2, 
from 
    table t 
where 
    condition=xxx 
+0

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

+0

Мне пришлось бы создать временную таблицу для каждой исходной записи, возвращенной, встроенной, чтобы получить остальное. Этот запрос выполняется в таблице из тысяч записей. Не уверен, что это возможно? –

+0

@LouisvanTonder: вы не можете выбрать несколько столбцов в качестве поля в подслове !! –