0

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

对于我的论文,我需要做一个 SQL 查询来回答这个问题:“给我 X 公司的所有专利,其中在特定时间跨度内有多个申请人(其他公司)”。我要提取的数据存储在一个名为 PATSTAT 的数据库中(我有 1 个月的试用期)并且正在使用 - 不要对 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 也可以说是“中级”。现在这就是我被卡住的地方。我尝试了以下方法,但这不起作用

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] [Error Code: 1064, SQL State: 0] Not unique table/alias: 'tls207_pers_appln'”

我认为仅 4 小时 SQL 我的方法还不错,但我确实需要一些关于如何进行的指导,因为我没有取得任何进展。

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

如果您需要更多信息来给我指导,请告诉我。

期待您的回答。

最好的问候肯德尔斯

4

3 回答 3

0

您正在引用 table 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"
于 2013-07-06T22:52:49.760 回答
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 没有给出任何表定义,我不得不发明这些]

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

于 2013-07-07T13:56:10.617 回答
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”内连接语法,如果您想通过谷歌搜索更多信息)(尽管我认为您使用的数据库可能不支持这种较新的语法)。

于 2013-07-07T01:55:05.643 回答