0

我在使用以下 SQL INNER JOIN 语句时遇到问题。我可能在语法上遗漏了一些东西:

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

也许它涉及 GROUP BY?

4

8 回答 8

2

可能:

select * from
(SELECT DISTINCT Name from Names WHERE Haircolor='Red') uniquenames
INNER JOIN
(SELECT * FROM Names) allnames
ON uniquenames.Name = allnames.Name

- 这取决于你真正想看到什么。

更新:原始答案的SQLFiddle

但是,更好的答案(如果使用 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 here

于 2013-08-13T23:42:26.883 回答
1

这是一个ROW_NUMBER查询示例。我现在无法测试它,所以可能会有一些错误需要解决。但为了给您一个大致的概念,它以这样的查询开始:

select
  t.*,
  row_number() over (partition by name order by address) as rn
from
  table t
where
  haircolor = 'red'

这为每个红发人提供了一行,并添加了一个列rn,该列在每组具有相同name.

然后要从每个组中获取第一个,只需添加一个外部查询以从第一个查询 where 中选择行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
于 2013-08-14T19:22:06.040 回答
1
SELECT * FROM names WHERE haircolor = 'red' GROUP BY name ORDER BY email ASC/DESC

从原始帖子中,我看到您似乎正在自己加入一张桌子,我完全看不出您为什么要这样做

根据您的加入,有一些评论/答案,我认为这可能会使事情变得混乱。您的查询过于复杂。

如果您碰巧有两个表,客户端和客户端功能/服务,那么我可以理解您为什么需要加入。但是对于单个表,您只是不需要它。

根据评论更新

SELECT DISTINCT name, haircolor, address, phone, email FROM names WHERE haircolor = 'red'

如果返回结果无关紧要,那么这应该可以满足您的需要。每个返回的行都应该有一个不同的“名称”,所以你应该只返回两行,我没有测试过,但你可以试试。

这是小提琴,http: //sqlfiddle.com/#!2/cc2e4/7

于 2013-08-14T20:25:30.057 回答
0

如果你不关心你想要的愿望行,我会做这样的事情。

   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)
于 2013-08-14T19:44:34.637 回答
0

更新基于 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
于 2013-08-13T23:57:57.113 回答
0

brother , try to removed ur curly bracket , i hope the query below able to solved ur enquiries

SELECT DISTINCT Name from Table.Names
INNER JOIN (SELECT * FROM Table.Names) allnames
ON uniquenames.Name = allnames.Name
WHERE Haircolor='Red 
于 2013-08-14T02:52:10.900 回答
0

除了这一点

Table.Names

看起来不对,你为什么不能这样做:

SELECT * from Table.Names WHERE Haircolor='Red'

我错过了什么吗?

于 2013-08-14T00:52:34.843 回答
0

您在 OP 中的查询是一种非常迂回的说法

Select * From Names Where HairColor = 'Red'

将 distinct 子查询连接回原始表基本上否定了 distinct 关键字。你能提供更多关于你正在寻找什么的信息吗?最好有一个例子。

于 2013-08-14T01:02:18.250 回答