选择返回exect no行的查询作为子查询的值进行比较

时间:2010-10-19 06:21:33

标签: sql sql-server-2005

我有一张名为 student 的表格。我写了这个查询:

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

在上面的查询中,它返回了两条记录;一个匹配'rajesh'和另一个匹配:'rohit'。

但我想要有3条记录:2条用于'rajesh',1条用于'rohit'。

请给我一些解决方案或告诉我我失踪的地方。

注意:子查询的结果计数没有修复,可能有很多单词存在一些不同的,有些多次出现。

由于

5 个答案:

答案 0 :(得分:3)

您的要求不明确,我会尝试解释原因。

让我们定义表学生

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'

过滤子句只是说现有行是否满足给定条件(对于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值John,Bill,John)

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

注意,数字(1),(2),(3)显示为显示ord的值,尽管它们不是由查询返回的。

答案 1 :(得分:2)

如果您可以在调用代码中拆分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'

答案 2 :(得分:1)

尝试使用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

答案 3 :(得分:0)

只是因为你有两次标准并不意味着每个标准会返回1个结果。 SQL引擎通常只使用唯一标准 - 因此,从您的示例中,IN子句中将有2个条件:'rajesh','rohit'

为什么你需要返回2个结果?你桌上有两个rajesh吗?他们应该两个回来。你不需要两次要求rajesh才能实现。你的数据是什么样的?你想看到什么回来?

答案 4 :(得分:0)

嗨我正在查询,就像你给出的一样,它给了我在in子句条件下匹配的所有数据。就像你的帖子

从人物中选择* 在哪里( “卡森”,“金”,“卡森” ) 按FirstName排序

并且它给我所有符合此标准的记录