2016-04-09 42 views
1

Oracle SQL Developerのデータベースを割り当ての一部として実行していますが、インストールするすべてのセンサーをリストする必要があるクエリを実行する際に問題があります彼らを担当している特定の種類の会社。私はこのために使用SQL - 3つの異なるテーブルと弱いエンティティを関連付けるクエリ

テーブルには、次のとおりです。

CREATE TABLE Company 
    (
    IDempresa  INTEGER NOT NULL , 
    Nome   VARCHAR2 (64) , 
    Localizacao  VARCHAR2 (64) , 
    TipoEmpresa_IDE INTEGER NOT NULL 
) ; 
ALTER TABLE Company ADD CONSTRAINT Company_PK PRIMARY KEY (IDempresa) ; 

CREATE TABLE Sensor 
    (
    ID_sensor  INTEGER NOT NULL , 
    Cost   NUMBER , 
    TipoSensor_IDS INTEGER NOT NULL , 
    Precisao FLOAT , 
    Infra_IDinf INTEGER NOT NULL 
) ; 
ALTER TABLE Sensor ADD CONSTRAINT Sensor_PK PRIMARY KEY (ID_sensor) ; 

CREATE TABLE TypeCompany 
    (
    IDE   INTEGER NOT NULL , 
    Name  VARCHAR2 (64) , 
    AreaService VARCHAR2 (64) 
) ; 
ALTER TABLE TypeCompany ADD CONSTRAINT TypeCompany_PK PRIMARY KEY (IDE) ; 

基本的に私は必要なもののサービスエリア与えられたすべてのセンサーのリストを取得することです。問題は、サービスエリアが企業テーブルのタイプに属していることです。企業テーブルの1つはn個の関係にあるセンサ自体に結びついている多数の企業(1対n関係)を起点としています。

私の問題は、Natrual結合で2つのテーブルの間で選択を行うことができますが、私はそれらを得るようにローカル変数を使用してローカル変数を使用する必要があるかどうかわからないため、それは私が必要とする4つのテーブル(会社、会社、企業からセンサーとセンサーへと作成された弱い実体のタイプ、最終的なものは私が作る必要があるリスト)を関連付けるか、別の方法があるかどうかです。

編集:ここでは

は、すべてのテーブルに関連するモデルの印刷です:http://imgur.com/cWJQQEq

私が試してみて、私は再び必要なものを説明しましょう:私は必要なテーブルTypeCompanyから「AreaService」パラメータ与えられましたテーブルセンサからのすべての情報を一覧表示します。しかし私はそこに着く必要があるすべてのIDを保存する方法を知らない。私はジョインについて読んだことがありますが、実際にそれらを使用する方法や私の問題を解決する方法はわかりません。申し訳ありませんが、それは愚かな質問です。

+0

なぜ社内テーブルの構造を含めなかったのですか?サンプルデータセットと、そのデータセットに関するクエリの予測結果を提供する場合は、クエリの作成を手助けする方がはるかに簡単です。 –

+0

@ Yaron Idan申し訳ありませんが、私のテーブルはポルトガル人の名前で作成されています(私はポルトガル人です)。テーブルの名前を英語で編集しました。 –

+0

私が言ったように、この例では、データセットとクエリ結果の例が多く役立ちます。他の2つのテーブルのいずれかに接続されているセンサーテーブルは、実際には表示されません。 –

答えて

0

あなたが提供した詳細をすべて考慮に入れて、ERDの弱いエンティティを追加のテーブルとして扱った後(私はこの種のオブジェクトをOracleに実装する方法は知らないので)、これはクエリは必要なものをあなたに提供する必要があります -

SELECT * 
FROM sensor s INNER JOIN Relation_11 r ON s.ID_sensor = r.sensor_ID_sensor 
INNER JOIN Company c ON r.Empresa_IDEmpresa = c.IDempresa 
WHERE c.IDempresa in (SELECT IDempresa 
         FROM Company c INNER JOIN TypeCompany tc ON c.TipoEmpresa_IDE = tc.IDE 
         WHERE tc.AreaService = <AreaServiceVar>) 
+0

これを通って助けてくれてありがとう、それは働く! あなたはそれらの内側の結合が何をしているのかを私に説明することができますか?あなたはそれらの "上"を使用しますが、どこの部分の "内"ですか? –

+0

inは、外部クエリの会社IDが内部クエリから返された会社IDに存在するかどうかを単純にチェックします。私の答えが役に立ったら、それを正しい答えとしてマークしてください。 –

+0

答えに感謝しますが、 "in"と "="の違いは何ですか? また、最後にselectを実行して、ユーザー入力によって指定されたIDを取得します。それはSQLでそれを行う通常の方法ですか?私は他のプログラミング言語で作業することに慣れていたので、私の最初の考えはIDをローカル変数に格納し、その変数でテーブルにアクセスすることでした。私はあなたがSQLで物事をどのようにしないかと思いますか? –

関連する問題