为专利研究目的而陷入复杂的SQL查询

时间:2013-07-06 22:44:28

标签: mysql sql

我正在为我的大学论文收集研究数据。不幸的是,我不是计算机科学或编程专家,也没有任何SQL经验。

对于我的论文,我需要做一个SQL查询来回答这个问题:“给我一个公司X的所有专利,其中在特定的时间跨度内有多个申请人(其他公司)”。我想要提取的数据存储在一个名为PATSTAT的数据库中(我有一个月的试用期)并且正在使用 - 不要惊讶于SQL。

我尝试了很多查询,但总是遇到不同的语法错误。

这是界面的样子: http://www10.pic-upload.de/07.07.13/7u5bqf7jsow.png

我认为我非常了解需要做什么(也来自SQL POV),但我无法执行它。

我的想法:结果我想要公司的名称(参考下面输入的公司)

SELECT person_name from tls206_person table

现在因为我需要像

这样的标准
WHERE nb_applicants > 1 from tls201_appln table

我需要加入这两个表tls206和tls201。我确实阅读了一些关于SQL的简要介绍指南(由欧洲专利局提供),因为两个表都没有共同的“参考密钥”,我们需要使用表tls207_pers_appln als“intermediate”来说。现在这就是我陷入困境的地步。我尝试了以下但是这不起作用

SELECT person_name, tls201_appln.nb_applicants 
FROM tls206_person
INNER JOIN tls207_pers_appln ON tls206_person.person_id= tls207_pers_appln.person_id 
INNER JOIN tls207_pers_appln ON tls201_appln.appln_id=tls201_appln.appln_id
WHERE person_name = "%Samsung%" 
AND tls201_appln.nb_applicants > 1
AND tls201_appln.ipr_type = "PI"

我收到以下错误:“0:37:11 [SELECT - 0 row(s),0 secs] [错误代码:1064,SQL状态:0]不唯一的表/别名:'tls207_pers_appln'”

我认为只用了4个小时SQL我的方法并不差,但我真的需要一些指导如何继续,因为我没有取得任何进展。

理想情况下,我想计算(对于每家公司)和每一行分别找到多少“nb_applicants”。

如果您需要进一步的信息以便给我指导,请告诉我。

期待您的回答。

祝你好运 Kendels

3 个答案:

答案 0 :(得分:0)

您正在引用表tls201_appln,但它不在from子句中。我猜测tls207_pers_appln的第二个引用应该是另一个表:

SELECT person_name, tls201_appln.nb_applicants 
FROM tls206_person
INNER JOIN tls207_pers_appln ON tls206_person.person_id = tls207_pers_appln.person_id 
INNER JOIN tls201_appln ON tls201_appln.appln_id = tls207_pers_appln.appln_id
WHERE person_name like '%Samsung%"'
AND tls201_appln.nb_applicants > 1
AND tls201_appln.ipr_type = "PI"

答案 1 :(得分:0)

另一种做同样事情的方法,你可能会发现它更容易理解(如果你是sql的新手,那么你到目前为止这是令人印象深刻的),是:

SELECT tls206_person.person_name, tls201_appln.nb_applicants 
  FROM tls206_person, tls207_pers_appln, tls201_appln
 WHERE tls206_person.person_id = tls207_pers_appln.person_id 
   AND tls201_appln.appln_id = tls201_appln.appln_id
   AND tls206_person.person_name LIKE "%Samsung%" 
   AND tls201_appln.nb_applicants > 1
   AND tls201_appln.ipr_type = "PI"

(它等同于另一个答案,但不是试图理解JOIN语法,而是写出所有逻辑,而SQL足够聪明以使其工作 - 这通常被称为“新”或者“ISO”内连接语法,如果你想谷歌获取更多信息)(尽管有可能,我想,你正在使用的数据库不支持这种新语法。)

答案 2 :(得分:0)

  

对于我的论文,我需要做一个SQL查询来回答这个问题:“给我一个公司X的所有专利,其中在特定的时间跨度内有多个申请人(其他公司)”。

让我为你重新说一下:

SELECT * FROM patents p         -- : "Give me all patents 
WHERE p.company = 'X'           -- of a company X 
AND EXISTS (                    -- where there is 
        SELECT *
        FROM applicants x1
        WHERE x1.patent_id = p.patent_id
        AND x1.company <> 'X'   -- another company:: exclude ourselves
        AND x1.application_date >= $begin_date -- in a specific time span
        AND x1.application_date < $end_date
                -- more than one applicant (other company) 
                -- To avoid aggregation: Just repeat the same subquery
        AND EXISTS (                    -- where there is 
                SELECT *
                FROM applicants x2
                WHERE x2.patent_id = p.patent_id
                AND x2.company <> 'X'           -- another company:: exclude ourselves
                AND x2.company <> x1.company -- :: exclude other other company, too
                AND x2.application_date >= $begin_date -- in a specific time span
                AND x2.application_date < $end_date
                )
        )
        ;

[注意:由于OP没有提供任何表格定义,我不得不发明这些]

不是完美的查询,但它确实表达了您的意图。给定合理的键/索引,它也会合理地执行。