SQL-запрос вызывает у меня недостаток сна - PullRequest
3 голосов
/ 21 января 2012

Итак, я готовлюсь к экзамену и ударил большой камень по реке 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;

Я сейчас пытаюсь написать команду SQL для отображения для каждого пользователя, у которого есть разрешения для файлов с общим размером более 50: идентификатор пользователя, общий размер всех файлов, для которых у пользователя есть разрешения, и пароль пользователя.,

Вот что у меня есть, но когда я пытаюсь что-то добавить, чтобы получить пароль, SQL + вызывает шипение, и на моем экране скоро будет дыра!

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

Ответы [ 4 ]

8 голосов
/ 21 января 2012

В oracle необходимо указать всю группу с помощью

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;

Это отличается от MySQL, где подразумевается группировка, но это более правильно.

5 голосов
/ 21 января 2012

Присоединиться к пользовательской таблице и добавить пароль в группу по предложению:

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;
4 голосов
/ 21 января 2012

Используйте синтаксис 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, которые не имеют функции агрегирования.

1 голос
/ 21 января 2012

Это должно работать:

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

Это может быть сделано без внутреннего объединения, однако, если вам нужно больше полей, это упрощает добавление их без добавления дополнительных полей всгруппировать по пунктам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...