SQL查询不同的内部联接问题
下面的SQL内部联接语句有问题。我可能在语法上遗漏了一些东西:SQL查询不同的内部联接问题,sql,sql-server,Sql,Sql Server,下面的SQL内部联接语句有问题。我可能在语法上遗漏了一些东西: SELECT * from (SELECT DISTINCT Name from Table.Names WHERE Haircolor='Red') uniquename INNER JOIN (SELECT * FROM Table.Names) allnames ON uniquenames.Name = allnames.Name; 我想要所有头发颜色为“红色”的名字,但我不想要任何重复的名字 NAME HA
SELECT * from
(SELECT DISTINCT Name from Table.Names WHERE Haircolor='Red') uniquename
INNER JOIN
(SELECT * FROM Table.Names) allnames
ON uniquenames.Name = allnames.Name;
我想要所有头发颜色为“红色”的名字,但我不想要任何重复的名字
NAME HAIRCOLOR ADDRESS PHONE EMAIL
----- --------- ------- ----- -----
Joe Red 123 Street 20768422 blah@example.com
Joe Red 828 Street 703435422 blah4@example.com
Joe Red 165 Street 10768422 blah3@example.com
Jamie Blond 4655 Street 10568888 blah3@example.com
John Brown 941 Street 40768422 blah5@example.com
Josephine Red 634 Street 43444343 blah2@example.com
Josephine Red 394 Street 43414343 blah7@example.com
查询应返回:
NAME HAIRCOLOR ADDRESS PHONE EMAIL
----- --------- ------- ----- -----
Joe Red 123 Street 20768422 blah@example.com
Josephine Red 634 Street 43444343 blah2@example.com
可能涉及一组人?可能:
select * from
(SELECT DISTINCT Name from Names WHERE Haircolor='Red') uniquenames
INNER JOIN
(SELECT * FROM Names) allnames
ON uniquenames.Name = allnames.Name
-这取决于你到底想看什么
更新:SQLFIDLE获取原始答案
但是,更好的答案(如果使用MySQL)可能是:
select * from Names WHERE Haircolor='Red' group by Name
(请注意,为每个与头发颜色匹配的姓名返回的特定行基本上是随机的。)
SQLFiddle
进一步更新:对于SQLServer,请尝试:
with cte as
(select n.*, row_number() over (partition by name order by address) r
from Names n WHERE Haircolor='Red')
select NAME, HAIRCOLOR, ADDRESS, PHONE, EMAIL
from cte where r=1
-这将返回每个名称-SQLFiddle的第一行(按地址,字母顺序)。可能:
select * from
(SELECT DISTINCT Name from Names WHERE Haircolor='Red') uniquenames
INNER JOIN
(SELECT * FROM Names) allnames
ON uniquenames.Name = allnames.Name
-这取决于你到底想看什么
更新:SQLFIDLE获取原始答案
但是,更好的答案(如果使用MySQL)可能是:
select * from Names WHERE Haircolor='Red' group by Name
(请注意,为每个与头发颜色匹配的姓名返回的特定行基本上是随机的。)
SQLFiddle
进一步更新:对于SQLServer,请尝试:
with cte as
(select n.*, row_number() over (partition by name order by address) r
from Names n WHERE Haircolor='Red')
select NAME, HAIRCOLOR, ADDRESS, PHONE, EMAIL
from cte where r=1
-这将返回每个名称的第一行(按地址,按字母顺序排列)-SQLFiddle。根据OP的注释更新:如果希望名称只出现一次,则需要在其他字段上使用聚合子句,并按名称分组
SELECT Name, MAX(Address), MAX(PhoneNumber)--, MAX(YourDesiredColumnHere)
FROM Table.Names
WHERE Name IN (
SELECT Name
FROM Table.Names
WHERE Haircolor = 'RED')
GROUP BY
Name
根据OP的评论进行更新:如果希望名称只出现一次,则需要在其他字段上使用聚合子句,并按名称分组
SELECT Name, MAX(Address), MAX(PhoneNumber)--, MAX(YourDesiredColumnHere)
FROM Table.Names
WHERE Name IN (
SELECT Name
FROM Table.Names
WHERE Haircolor = 'RED')
GROUP BY
Name
除此之外
Table.Names
这看起来不对,为什么你不能这样做:
SELECT * from Table.Names WHERE Haircolor='Red'
除了这一点,我还遗漏了什么吗
Table.Names
这看起来不对,为什么你不能这样做:
SELECT * from Table.Names WHERE Haircolor='Red'
我遗漏了什么吗?你在OP中提出的问题是一种非常迂回的说法
Select * From Names Where HairColor = 'Red'
将distinct子查询连接回原始表基本上会否定distinct关键字。你能提供更多关于你要找什么的信息吗?最好举个例子。OP中的查询是一种非常迂回的表达方式
Select * From Names Where HairColor = 'Red'
将distinct子查询连接回原始表基本上会否定distinct关键字。你能提供更多关于你要找什么的信息吗?举个例子最好。兄弟,试着去掉你的大括号,我希望下面的查询能够解决你的查询
SELECT DISTINCT Name from Table.Names
INNER JOIN (SELECT * FROM Table.Names) allnames
ON uniquenames.Name = allnames.Name
WHERE Haircolor='Red
兄弟,试着去掉你的小括号,我希望下面的问题能够解决你的问题
SELECT DISTINCT Name from Table.Names
INNER JOIN (SELECT * FROM Table.Names) allnames
ON uniquenames.Name = allnames.Name
WHERE Haircolor='Red
下面是一个
行号
查询的示例。我现在不能测试它,所以可能有一些bug需要解决。但为了给您一个大致的想法,它从这样一个查询开始:
select
t.*,
row_number() over (partition by name order by address) as rn
from
table t
where
haircolor = 'red'
这将为每个红头发的人提供一行,并添加一列rn
,该列在每组行中提供一个序列号,这些行具有相同的名称
然后,要从每个组中获取第一行,只需添加一个外部查询,从第一个查询中选择行,其中rn=1
select * from (
select
t.*,
row_number() over (partition by name order by address) as rn
from
table t
where
haircolor = 'red'
)
where rn=1
下面是一个
行号
查询的示例。我现在不能测试它,所以可能有一些bug需要解决。但为了给您一个大致的想法,它从这样一个查询开始:
select
t.*,
row_number() over (partition by name order by address) as rn
from
table t
where
haircolor = 'red'
这将为每个红头发的人提供一行,并添加一列rn
,该列在每组行中提供一个序列号,这些行具有相同的名称
然后,要从每个组中获取第一行,只需添加一个外部查询,从第一个查询中选择行,其中rn=1
select * from (
select
t.*,
row_number() over (partition by name order by address) as rn
from
table t
where
haircolor = 'red'
)
where rn=1
如果你不在乎你想要的愿望,我会那样做
SELECT tblName.*
FROM Table.Names as tblName
INNER JOIN ( SELECT Name ,HairColor, MIN(Email)
FROM Table.Names
WHERE Haircolor='Red'
GROUP BY Name ,HairColor) as tmp ON ( tmp.Email = tblName.Email)
如果你不在乎你想要的愿望,我会那样做
SELECT tblName.*
FROM Table.Names as tblName
INNER JOIN ( SELECT Name ,HairColor, MIN(Email)
FROM Table.Names
WHERE Haircolor='Red'
GROUP BY Name ,HairColor) as tmp ON ( tmp.Email = tblName.Email)
从最初的帖子中,我看到你似乎在加入一张桌子,我根本不明白你为什么要这样做
基于您的加入,已经有一些评论/答案,我认为这可能会让您感到困惑。你的问题过于复杂了
如果您碰巧有两个表,客户机和客户机功能/服务,那么我可以理解您为什么需要连接。但是对于一张桌子,你根本不需要它
根据评论更新
如果返回结果不重要,那么这应该满足您的需要。每个返回的行应该有一个不同的“名称”,所以您应该只返回两行,我没有测试过它,但您可以尝试一下
这是小提琴
从最初的帖子中,我看到你似乎在加入一张桌子,我根本不明白你为什么要这样做
基于您的加入,已经有一些评论/答案,我认为这可能会让您感到困惑。你的问题过于复杂了
如果您碰巧有两个表,客户机和客户机功能/服务,那么我可以理解您为什么需要连接。但是对于一张桌子,你根本不需要它
根据评论更新
如果返回结果不重要,那么这应该满足您的需要。每个返回的行应该有一个不同的“名称”,所以您应该只返回两行,我没有测试过它,但您可以尝试一下
这是小提琴,我想
Haircolor='Red
应该是Haircolor='Red'
(最后只有一个引号)?你看到了什么问题?我只是更新了问题-我没有得到我想要的数据。我将返回所有的名称,而不仅仅是Haircolor为“Red”的名称,因此在Haircolor过滤器之后,您希望每个组中有一个任意行,按名称分组。或者,您需要每组中的第一行/最佳行,以获取一些我们不知道的排序规则。听起来像是那些行号()
作业之一。除非您的SQL方言类似于mysql,其中没有行号()
@WumpusQ.Wumbley,否则我使用的是SQL Server。我不在乎我选择什么样的条目——它可能是第一条,只需要其中一条。我该怎么办呢?我想应该是Haircolor='Red