0

大学の論文の調査研究のためにデータを収集しようとしています。残念ながら、私はコンピューター サイエンスやプログラミングの専門家ではなく、SQL の経験もありません。

私の論文では、次の質問に答える SQL クエリを実行する必要があります。抽出したいデータは、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

これら 2 つのテーブル tls206 と tls201 を結合する必要があります。SQL に関する簡単な紹介ガイド (欧州特許庁提供) を読みましたが、両方のテーブルに共通の「参照キー」がないため、いわば「中間」テーブル tls207_pers_applnals を使用する必要があります。今、私が立ち往生しているポイントです。次のことを試しましたが、これは機能しません

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"

次のエラーが表示されます。

わずか 4 時間の SQL の場合、私のアプローチは悪くないと思いますが、進歩が見られないため、進め方についてのガイダンスが本当に必要です。

理想的には、(すべての会社について)およびすべての行について、それぞれ「nb_applicants」がいくつ見つかったかを数えたいと思います。

ガイダンスを提供するためにさらに情報が必要な場合は、お知らせください。

回答をお待ちしております。

よろしくケンデルズ

4

3 に答える 3

0

私の論文では、次の質問に答える SQL クエリを実行する必要があります。

あなたのためにそれを言い換えましょう:

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 に答える
0

table を参照していますが、句tls201_applnにはありません。への 2 番目の参照は、他のテーブルへの参照である必要があると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 に答える