Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询不同的内部联接问题_Sql_Sql Server - Fatal编程技术网

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

下面的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        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