Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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
Mysql 根据一个表中的不同值和另一个表中的不同值查找记录_Mysql_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Mysql 根据一个表中的不同值和另一个表中的不同值查找记录

Mysql 根据一个表中的不同值和另一个表中的不同值查找记录,mysql,sql,sql-server,sql-server-2008,Mysql,Sql,Sql Server,Sql Server 2008,我有以下选项卡(粗体是PK,斜体是FK) 发明人(发明人ID,发明人第一,发明人最后,专利号) 受让人(受让人ID,受让人姓名,受让人城市,受让人国家专利号) InventorID和受让人ID只是出于索引目的而自动编号的标识,在其他方面毫无意义 我想找到的是,一个人的名字和姓氏相同,但至少有两个不同的受让人 到目前为止我所拥有的(据我所知是非常少的) 在这里,我为不同的受让人使用了左外联接。 如果发明人没有任何受让人,则“isnull”函数将输入空白值。 请使用下面的sql查询: 如果您只想要

我有以下选项卡(粗体是PK,斜体是FK)

发明人(发明人ID,发明人第一,发明人最后,专利号)

受让人(受让人ID,受让人姓名,受让人城市,受让人国家专利号)

InventorID和受让人ID只是出于索引目的而自动编号的标识,在其他方面毫无意义

我想找到的是,一个人的名字和姓氏相同,但至少有两个不同的受让人

到目前为止我所拥有的(据我所知是非常少的)


在这里,我为不同的受让人使用了左外联接。
如果发明人没有任何受让人,则“isnull”函数将输入空白值。
请使用下面的sql查询:



如果您只想要一个发明人列表,该列表中的发明人第一个对其发明有多个AssigneName,请尝试以下操作:

;with inventor_cte(inventorfirst,cnt)
as
  (
  SELECT 
        i.inventorfirst
        , count(distinct a.assigneename) cnt
  FROM 
       inventors i 
       inner join  assignees a ON 
            i.patentno=a.patentno
  GROUP BY i.inventorfirst
  )
select inventorfirst from inventor_cte where cnt>1
上述方法的一种替代方法是使用
HAVING
子句:

 SELECT i.inventorfirst
  FROM 
       inventors i 
       inner join  assignees a ON 
            i.patentno=a.patentno
  GROUP BY i.inventorfirst
  HAVING count(distinct a.assigneename) > 1

我更喜欢第一种语法——不确定哪种更有效

这给了我以下错误:Msg 8120,级别16,状态1,第5行列“inventor.InventorFirst”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。我的代码是通过sql server生成的;对mySql不太确定。我已经对解决方案进行了编辑,因此它现在具有正确的分组,并将在sql Server中工作查询可以工作,但我特别希望结果只显示拥有多个受让人专利的发明人的姓名
;with inventor_cte(inventorfirst,cnt)
as
  (
  SELECT 
        i.inventorfirst
        , count(distinct a.assigneename) cnt
  FROM 
       inventors i 
       inner join  assignees a ON 
            i.patentno=a.patentno
  GROUP BY i.inventorfirst
  )
select inventorfirst from inventor_cte where cnt>1
 SELECT i.inventorfirst
  FROM 
       inventors i 
       inner join  assignees a ON 
            i.patentno=a.patentno
  GROUP BY i.inventorfirst
  HAVING count(distinct a.assigneename) > 1