我有一张名为 student 的表格。我写了这个查询:
select * From student where sname in ('rajesh','rohit','rajesh')
在上面的查询中,它返回了两条记录;一个匹配'rajesh'和另一个匹配:'rohit'。
但我想要有3条记录:2条用于'rajesh',1条用于'rohit'。
请给我一些解决方案或告诉我我失踪的地方。
注意:子查询的结果计数没有修复,可能有很多单词存在一些不同的,有些多次出现。
由于
答案 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排序
并且它给我所有符合此标准的记录