Выберите запрос, который возвращает exect количество строк, как сравнивать в значениях подзапроса - PullRequest
1 голос
/ 19 октября 2010

У меня есть стол с именем студент . Я написал этот запрос:

select * From student where sname in ('rajesh','rohit','rajesh')

В приведенном выше запросе он возвращает мне две записи; одно соответствие 'rajesh' и другое соответствие: 'rohit'.

Но я хочу, чтобы было 3 записи: 2 для «Раджеш» и 1 для «Рохит».

Пожалуйста, предоставьте мне какое-нибудь решение или скажите, где мне не хватает.

ПРИМЕЧАНИЕ: количество результатов подзапроса не является фиксированным, в нем может быть много слов, несколько отличных и несколько встречающихся.

Спасибо

Ответы [ 5 ]

3 голосов
/ 19 октября 2010

Ваши требования не ясны, и я постараюсь объяснить, почему.

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

ID  FirstName   LastName
1   John        Smith   
2   Mike        Smith
3   Ben         Bray
4   John        Bray
5   John        Smith
6   Bill        Lynch
7   Bill        Smith

Запрос с предложением WHERE:

FirstName in ('Mike', 'Ben', 'Mike') 

вернет только 2 строки, потому что это может быть переписано как:

FirstName='Mike' or FirstName='Ben' or FirstName='Mike'

WHERE - это фильтрующее предложение, которое просто говорит, удовлетворяет ли существующая строка заданным условиям или нет (для каждой из строк, созданных предложением FROM.

Допустим, у нас есть подзапрос, который возвращает любое количество не определенных имен FirstNames

В случае, если SQ содержит 'Mike', 'Ben', 'Mike', используя внутреннее соединение, вы можете получить эти 3 строки без проблем

Select ST.* from Students ST
Inner Join (Select name from …. <your subquery>)  SQ
On ST.FirstName=SQ.name

Результат будет:

ID  FirstName   LastName
2   Mike        Smith
2   Mike        Smith
3   Ben         Bray

Данные примечания не упорядочены по порядку имен, возвращаемых SQ. Если вы хотите это, SQ должен вернуть некоторый код заказа, например ::

Ord Name
1.  Mike
2.  Ben
3.  Mike

В этом случае запрос должен быть:

Select ST.* from Students ST
Inner Join (Select ord, name from …. <your subquery>)  SQ
On ST.FirstName=SQ.name
Order By SQ.ord

И результат:

ID  FirstName   LastName
2   Mike        Smith    (1)
3   Ben         Bray     (2)
2   Mike        Smith    (3)

Теперь давайте посмотрим, что произойдет, если подзапрос вернет

  Ord   Name
   1.   Mike
   2.   Bill
   3.   Mike

В итоге вы получите

ID  FirstName   LastName
2   Mike        Smith   (1)
6   Bill        Lynch   (2)
7   Bill        Smith   (2)
2   Mike        Smith   (3)

Еще хуже, если у вас есть что-то вроде:

Ord  Name
1.   John
2.   Bill
3.   John

Результат:

ID FirstName LastName
1  John      Smith    (1)
4  John      Bray     (1)
5  John      Smith    (1)
6  Bill      Lynch    (2)
7  Bill      Smith    (2)
1  John      Smith    (3)   
4  John      Bray     (3)
5  John      Smith    (3)

Это сложная ситуация, и вы должны уточнить, что именно является требованием. Если вам нужен только один студент с одинаковым именем, для каждой строки в SQ вы можете использовать что-то вроде SQL 2005 +):

;With st1 as 
(
Select Row_Number() over (Partition by SQ.ord Order By ID) as rowNum,
       ST.ID,
       ST.FirstName,
       ST.LastName,
       SQ.ord
  from Students ST
 Inner Join (Select ord, name from …. <your subquery>)  SQ
    On ST.FirstName=SQ.name
)
Select ID, FirstName, LastName
  From st1
 Where rowNum=1 -- that was missing row, added later
 Order By ord

Возвращается (для значений SQ Джон, Билл, Джон)

ID FirstName LastName
1  John      Smith    (1)
6  Bill      Lynch    (2)
1  John      Smith    (3)

Обратите внимание, что числа (1), (2), (3) отображаются для отображения значения ord, хотя они не возвращаются по запросу.

2 голосов
/ 19 октября 2010

Если вы можете разделить предложение where в своем коде вызова, вы можете выполнить UNION ALL для каждого предложения.

SELECT * FROM Student WHERE sname = 'rajesh'
UNION ALL SELECT * FROM Student WHERE sname = 'rohit'
UNION ALL SELECT * FROM Student WHERE sname = 'rajesh'
1 голос
/ 19 октября 2010

Попробуйте использовать JOIN:

SELECT ...
FROM Student s
    INNER JOIN (
        SELECT 'rajesh' AS sname
        UNION ALL
        SELECT 'rohit'
        UNION ALL
        SELECT 'rajesh') t ON s.sname = t.sname
0 голосов
/ 19 октября 2010

Привет, я запрос, как вы дали выше, и он дает мне все данные, которые соответствуют в условии в пункте. так же, как ваш пост

выберите * от лица где человек в ( 'Carson', 'Ким', 'Carson' ) заказ по FirstName

и дает мне все записи, которые соответствуют этому критерию

0 голосов
/ 19 октября 2010

только потому, что у вас есть критерии там два раза, не означает, что он даст 1 результат на критерии.Механизмы SQL обычно просто используют уникальные критерии - таким образом, из вашего примера в предложении IN будет 2 критерия: 'rajesh', 'rohit'

ПОЧЕМУ вам нужно вернуть 2 результата?есть два раджеша в твоем столе?они должны ОБА вернуться тогда.Вам не нужно дважды просить Раджеша, чтобы это произошло.Как выглядят ваши данные?Что вы хотите увидеть возвращенным?

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