2012-01-21 10 views
3

の欠如はだから私は受験のために見直していますし、SQL川(か、廃棄物の地面)に大きな岩を打ってきた私を引き起こしてSQLクエリ睡眠

私は、次の表を作り、次のデータを挿入:

create table Permissions 
(
    fileName VARCHAR(40), 
    userID VARCHAR (16), 
    type VARCHAR(10), 
    startdate DATE, 
    duration NUMBER (5), 
    constraint Pri_key PRIMARY KEY (userID,fileName) 
); 

create table Files 
(
    name VARCHAR(20), 
    fsize INT, 
    numberofpermissions INT, 
    constraints PRI_KEY2 PRIMARY KEY (name) 
); 

create table Users 
(
    id VARCHAR(20), 
    password VARCHAR (20), 
    constraint Pri_key3 PRIMARY KEY (id) 
); 

-- after all tables create: 
alter table Permissions 
    add constraint Forn_key FOREIGN KEY (userID) REFERENCES Users(id) 
    INITIALLY DEFERRED DEFERRABLE; 
alter table Permissions 
    add constraint Forn_key2 FOREIGN KEY (filename) REFERENCES Files(name) 
    INITIALLY DEFERRED DEFERRABLE; 
insert into Permissions VALUES ('Agenda','Jones','read','19-JAN-10',30); 
insert into Permissions VALUES ('Agenda','Chun','read','19-JAN-10',30); 
insert into Permissions VALUES ('Agenda','Rashid','write','17-JAN-10',50); 
insert into Permissions VALUES ('Finance','Chun','write','05-DEC-09',50); 
insert into Permissions VALUES ('AnnualReport','Jones','write','12-DEC-09',50); 
insert into Users VALUES ('Jones', 'duck'); 
insert into Users VALUES ('Chun', 'tiger'); 
insert into Users VALUES ('Adams', 'shark'); 
insert into Users VALUES ('Rashid', 'puma'); 
insert into Files VALUES ('Agenda', 32, 3); 
insert into Files VALUES ('FinanceTables',645, 0); 
insert into Files VALUES ('Finance', 120, 1); 
insert into Files VALUES ('AnnualReport', 1205, 1); 
commit; 

私は、合計サイズが50を超えるファイルに対して パーミッションのユーザーごとに表示するSQLコマンドを作成しようとしています。ユーザーの id、ユーザーに許可されているすべてのファイルの合計サイズ、ユーザーのパスワードは です。

パスワードの取得に何かを追加しようとすると、SQL +はひっそりとした音を立ててすぐに画面に穴が開いてしまいます。 Oracleで

SELECT permissions.userID, sum(fsize) AS Totalsize 
FROM files, permissions 
where permissions.filename = files.name 
group by permissions.userid 
having SUM(fsize) > 50; 
+3

ヒシフィットの正確な性質を指定してください。 –

+0

あまりにも助けてくれてありがとう! – Charlie

答えて

8

、あなたはこのグループによっては暗示することができますが、これは、より正確であるMySQLの異なる

SELECT permissions.userID, users.password, sum(fsize) AS Totalsize 
FROM files, permissions, users 
where permissions.filename = files.name 
and users.id = permissions.userID 
group by permissions.userid, permissions.password 
having SUM(fsize) > 50; 

によりグループ全体を指定する必要があります。

+0

私はパスワードが許可テーブルにあるとは思わない。 –

+0

ええ、私はそれを実現し、クエリを修正しました –

+0

ありがとうございました!私は本当に私の元の試みで遠くにwasntして、私は実際にマイナスグループの場所で私は2番目のグループを指定していなかった場所でそれを得た嬉しいです!どうもありがとうございます! – Charlie

5

ユーザーテーブルに対して参加、およびgroup by句にパスワードを追加します。

SELECT permissions.userID, users.password, sum(fsize) AS Totalsize 
FROM files, permissions, users 
where permissions.filename = files.name 
and users.id = permissions.userID 
group by permissions.userid, users.password 
having SUM(fsize) > 50; 
+0

参加しますか? 'JOIN'はどこですか? –

+0

私は、概念レベルで、つまり2つのテーブルを関連付けることについて話しています。 JOINキーワードを使用するかどうかは、主にスタイルの問題です。 –

1

これは動作するはずです:

SELECT Users.id, Users.password, Totalsize 
FROM Users 
    INNER JOIN 
    (SELECT userId, SUM(fSize) AS TotalSize 
     FROM permissions 
      INNER JOIN files ON permissions.filename = files.name 
     group by permissions.userid 
     having SUM(fsize) > 50) t ON t.userId = Users.Id 

これは、インナーなしで行うことができ、もちろん参加する、しかし、より多くのフィールドが必要になる場合は、group by節に余分なフィールドを追加しなくても簡単に追加できます。

4

JOIN構文を使用します。これはANSI SQLに準拠しています。 WHEREを使用して結合することは、これ以上使用しない古い構文です。

SELECT 
    u.id AS userid, u.password, SUM(f.fsize) AS Totalsize 
FROM 
    users u 
    INNER JOIN permissions p 
     ON u.id = p.userID  
    INNER JOIN files f 
     ON p.filename = f.name 
GROUP BY 
    u.id, u.password 
HAVING 
    SUM(f.fsize) > 50; 

集約関数に基づく条件は、HAVING節に置く必要があることに注意してください。 WHERE句とHAVING句の違いは、グループ化する前にWHEREが実行され、グループ化後にHAVINGが実行されるということです。

また、GROUP BY句には、集計関数を持たないSELECTリストのすべての式を含める必要があります。

関連する問題