代码之家  ›  专栏  ›  技术社区  ›  Dr. Rajesh Rolen

选择返回执行行数作为子查询值比较的查询

  •  1
  • Dr. Rajesh Rolen  · 技术社区  · 15 年前

    我有一张叫的桌子 学生 . 我写过这个问题:

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

    在上面的查询中,它返回两个记录:一个匹配“rajesh”,另一个匹配“rohit”。

    但我想有3个记录:2个是“拉杰什”,1个是“罗希特”。

    请给我一些解决办法,或者告诉我在哪里找不到。

    注意:子查询的结果计数不固定,可以有多个单词,其中一些是明显的,一些是多次出现的。

    谢谢

    5 回复  |  直到 15 年前
        1
  •  1
  •   AdaTheDev    15 年前

    尝试使用联接:

    SELECT ...
    FROM Student s
        INNER JOIN (
            SELECT 'rajesh' AS sname
            UNION ALL
            SELECT 'rohit'
            UNION ALL
            SELECT 'rajesh') t ON s.sname = t.sname
    
        2
  •  3
  •   Niikola    15 年前

    你的要求不明确,我会解释原因。

    让我们定义学生表

    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') 
    

    将只返回两行,因为它可以重写为:

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

    WHERE是一个筛选子句,它只说明现有行是否满足给定条件(对于FROM子句创建的每一行)。

    假设我们有一个子查询,它返回任意数量的非独特的名字。

    如果sq包含使用inner join的“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的值,尽管它们不是通过查询返回的。

        3
  •  2
  •   Lieven Keersmaekers    15 年前

    如果可以拆分调用代码中的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'
    
        4
  •  0
  •   Anatoly G    15 年前

    仅仅因为你有一个标准在那里两次并不意味着它将返回每个标准1个结果。SQL引擎通常只使用唯一的条件-因此,从您的示例中,in子句中有两个条件:“rajesh”、“rohit”

    为什么需要返回2个结果?你桌上有两个拉吉吗?他们都应该回来。你不需要再要求拉杰什两次。你的数据是什么样的?你想看什么退货?

        5
  •  0
  •   JSJ    15 年前

    您好,我是查询,正如您在上面给出的,它提供了在in子句条件下匹配的所有数据。就像你的帖子一样

    从人员中选择*。 如果有人进来( 'carson'、'kim'、'carson' ) 按名字排序

    它给了我所有符合这个标准的记录

    推荐文章