0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
1

PSQL, несколько различных заданий

28.06.2016, 13:45. Показов 2170. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Имеем две таблицы books(книги) и publishers(издательства)
books содержит колонки book_name и publisher_id
publishers содержит pub_name и и те же publisher_id

Нужно отобразить список всех издательств (pub_name) и количество издаваемых ими книг(book_name).

Как делать простую выборку понимаю, а с двумя и более таблицамии застрял =(

Буду благодарен если сможете отписаться в личку, нужна помощь по PSQL до конца летнего семестра.

Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2016, 13:45
Ответы с готовыми решениями:

Импорт БД psql
Доброго времени суток. Есть дамп БД, сохраненный на сервере сделанный с помощью pg_dump. Нужно...

SQL Shell (psql)
Здравствуйте, установил postgresql, запускаю и не знаю, что вписывать. Час уже гуглю, ( P.S....

Начало работы с PSQL
Здравствуйте, имею Ubuntu 12.04, установил туда PSQL 9.1. В системе есть только одна учётная запись...

Ошибка psql при закрытии периодов
при выполнении закрытия периода pgsql вылетает с ошибкой ERROR: each UNION query must have the...

28
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
28.06.2016, 13:50 2
Цитата Сообщение от Ruson Посмотреть сообщение
Как делать простую выборку понимаю, а с двумя и более таблицамии застрял
связываете таблицы и делаете как обычно, как будто у вас одна большая таблица. для агрегатных функций используйте группировку

SQL
1
2
3
4
5
6
7
8
9
10
SELECT
  p.pub_name,
  COUNT(b.publisher_id)   -- хотя здесь надо бы указать первичный ключ books
FROM
  books b,
  publishers p
WHERE
  b.publisher_id = p.publisher_id
GROUP BY
  p.pub_name;
1
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
29.06.2016, 00:36  [ТС] 3
Цитата Сообщение от grgdvo Посмотреть сообщение
связываете таблицы и делаете как обычно, как будто у вас одна большая таблица
Спасибо, все работает, добавил еще ORDER BY для отображение по имени в алфавитном порядке.

Добавлено через 1 час 56 минут
Столкнулся со следующей проблемой. Нужно дописать к последней колонке в таблице author проверку, что я и сделал:
Код
alter table author ADD CHECK(col4  >= 1900 and col4  <= 1930);
но тут же получаю ошибку:
Код
ERROR:  check constraint "author_col4_check1" is violated by some row
вот схема таблицы
Код
      
      Table "public.author"
   Column   |  Type   | Modifiers
------------+---------+-----------
 col1       | numeric | not null
 col2       | text    | not null
 col3       | text    | not null
 col4       | numeric | not null
Пробовал создавать другие таблицы и потом добавить этот же CHECK constraint - все работает, а тут никак не хочет =(
0
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
29.06.2016, 02:43 4
Цитата Сообщение от Ruson Посмотреть сообщение
получаю ошибку
Дословный перевод ошибки: проверочное ограничение "xxxxx" нарушается некоторой строкой.
это обозначает, что в таблице уже есть записи, у которых в col4 есть значения, выходящие за диапазон [1900; 1930].
удалите эти записи или измените указанные значения и все пойдет.
1
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
29.06.2016, 12:05  [ТС] 5
Как удалить ограничение char(1)?
Ранее я установил ограничение для Middle Initial
Код
ALTER TABLE doctor ADD COLUMN "Middle Initial" CHAR(1);
Сейчас нужно изменить его на char(2). Обычно удаляю ограничения следующим образом
Код
ALTER TABLE doctor DROP CONSTRAINT constraint_name_check;
Но в даном случае, имени для CHAR(1) нету. Спасибо!
0
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
29.06.2016, 12:12 6
Лучший ответ Сообщение было отмечено Ruson как решение

Решение

ALTER TABLE ... ADD COLUMN не устанавливает ограничение, а добавляет новую колонку в таблицу!!!
поэтому какой DROP CONSTRAINT вы хотите сделать??
для изменения типа колонки используйте конструкцию
ALTER TABLE таблица ALTER COLUMN имя_колонки TYPE новый_тип_данных;
помощь здесь
1
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
29.06.2016, 12:15  [ТС] 7
Цитата Сообщение от grgdvo Посмотреть сообщение
ALTER TABLE ... ADD COLUMN не устанавливает ограничение, а добавляет новую колонку в таблицу!!!
Упс.. все верно, ошибочно скопировал не ту строчку. Добавлял ограние вот так:

Код
ALTER TABLE  tablename_tbl ADD Check (char_length (Initial) = 1) ;
В моем случае изменил удалением и пересозданием всей колонки.
Код
ALTER TABLE doctor drop COLUMN "Middle Initial";
ALTER TABLE doctor ADD COLUMN "Middle Initial" CHAR(2);
0
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
29.06.2016, 12:21 8
Лучший ответ Сообщение было отмечено Ruson как решение

Решение

Цитата Сообщение от Ruson Посмотреть сообщение
Изменил удалением и пересозданием всей колонки.
Это не всегда удобно, так как удаляются данные, которые уже могут находиться в таблице. ALTER COLUMN пытается конвертировать и сохраняет существующие данные. Если сконвертировать не удается, будет ошибка.

Добавлено через 3 минуты
Цитата Сообщение от Ruson Посмотреть сообщение
ошибочно скопировал не ту строчку
Не помню на память... попробуйте банально ADD CHECK заменить на DROP CHECK, если не задавали явно имя ограничению. Либо посмотрите полное текущее описание таблицы, там база какое-нибудь имя должна была назначить.
1
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
29.06.2016, 15:27  [ТС] 9
Ну и конечно-же я не мог не попробовать Ваш вариант который прекрасно сработал =)

Код
ALTER TABLE doctor ALTER COLUMN "Middle Initial" TYPE CHAR(2);
изменил char(1) на char(2)

Добавлено через 1 минуту
Цитата Сообщение от grgdvo Посмотреть сообщение
попробуйте банально ADD CHECK заменить на DROP CHECK
DROP CHECK не работает, может я конечно что-то упустил, пробовал несколько раз, поэтому и задал вопрос тут =)

Добавлено через 3 часа 3 минуты
Как добавить проверку на возраст к существующей таблице? Например, есть колонка "age" в которую пользователь вводит дату дня рождения, если пользователю 17 лет или меньше то он не может заполнить анкету. Представляю использование функции current_date, от которой нужно отминусовать введенную дату и сравнить результат с условием > 17, но не до конца понимаю как это корректно сделать в psql .
0
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
29.06.2016, 16:36 10
Лучший ответ Сообщение было отмечено Ruson как решение

Решение

Цитата Сообщение от Ruson Посмотреть сообщение
не до конца понимаю как это корректно сделать в psql .
да тут вроде ничего не должно смущать.
SQL
1
ALTER TABLE mytable ADD CONSTRAINT check_age17 CHECK (CURRENT_DATE - age > 17);
1
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
29.06.2016, 21:56  [ТС] 11
Цитата Сообщение от grgdvo Посмотреть сообщение
да тут вроде ничего не должно смущать.

Код
ALTER TABLE mytable ADD CONSTRAINT check_age17 CHECK (CURRENT_DATE - age > 17);
Дата вводится в формате ГГГГ-ММ-ДД, верно? я просто когда добавляю в таблицу данные, оно просто игнорирует это ограничение.
Код
insert into tablename_tbl (age) VALUES('2007-05-12')
0
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
30.06.2016, 02:22 12
ммм... косяк.. забыл на кол-во дней в году умножить. разница в датах - это кол-во дней между ними!!!

либо еще есть функция age, которая возвращает тип данных интервал. тогда
SQL
1
... CHECK (age("age") > '17 years'::INTERVAL);
плохо, что название колонки совпадает с именем функции. могут быть косяки с интерпретацией.
и колонка "age" в данном случае должна приводиться к типу timestamp
1
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
01.07.2016, 01:09  [ТС] 13
Да, вариант с функцией "age" однозначно лучше, так как количество дней в году может быть 365 и 366, уже будет не правильно =).
Название колонки изменил на "Birth Day" в даном случае это было возможным.

Следующий вопрос =)
Имеем пустую таблицу newzip_tbl
Код
 => \d newzip_tbl
        Table "public.newzip_tbl"
      Column       |  Type   | Modifiers
-------------------+---------+-----------
 home_price        | numeric |
 number_of_bedroom | numeric |
В нее нужно загрузить даные с myzip_vew в которой есть несколько колонок.

Выражение:
Код
INSERT INTO newzip_tbl(home_price, number_of_bedroom) SELECT(price, beds) FROM myzip_vew;
Приводит к ошибке:
Код
ERROR:  INSERT has more target columns than expressions
Получается я не могу выбрать нужные мне две колонки из нескольких других и вставить в нужную мне таблицу ?

Поправьте пожалуйста!
0
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
01.07.2016, 04:04 14
У SELECT надо убрать круглы скобки. Круглыми скобками вы создаете одну колонку типа record (запись), в которой содержаться ваши значения.
1
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
08.07.2016, 01:54  [ТС] 15
Здравствуйье, подскажите еще пожалуйста как создать точно такую же таблицу
Код
    Table "public.bookauthor"
  Column   |  Type   | Modifiers
-----------+---------+-----------
 isbn      | text    | not null
 au_number | numeric | not null
Indexes:
    "bookauthor_pkey" PRIMARY KEY, btree (isbn, au_number)
Foreign-key constraints:
    "bookauthor_au_number_fkey" FOREIGN KEY (au_number) REFERENCES author(au_id)
    "bookauthor_isbn_fkey" FOREIGN KEY (isbn) REFERENCES book(isbn)
Я прописал следующим выражением:
Код
=> create table t_bookauthor(isbn text NOT NULL references book(isbn), au_number numeric NOT NULL references author(au_id));
и результат:
Код
=> \d t_bookauthor
   Table "public.t_bookauthor"
  Column   |  Type   | Modifiers
-----------+---------+-----------
 isbn      | text    | not null
 au_number | numeric | not null
Foreign-key constraints:
    "t_bookauthor_au_number_fkey" FOREIGN KEY (au_number) REFERENCES author(au_id)
    "t_bookauthor_isbn_fkey" FOREIGN KEY (isbn) REFERENCES book(isbn)
Я понимаю что в каждой таблице должна быть одна колонка с PRIMARY KEY, но в данном случае в таблице всего две колонки и обе являются FOREIGN KEY, которые используются в других таблицах. Но тем не менее в первом варианте присутствует строка
Код
Indexes:
    "bookauthor_pkey" PRIMARY KEY, btree (isbn, au_number)
... которая говорит о наличии PRIMARY KEY?

Спасибо!

Добавлено через 6 часов 12 минут
Понял, это Composite Surrogate Key который так и определяется, двумя колонками
Код
=> create table t_bookauthor(
    isbn text NOT NULL 
        references book(isbn), 
    au_number numeric NOT NULL 
        references author(au_id),
    primary key (isbn, au_number)
);
Добавлено через 19 часов 26 минут
Добрый день!

Столкнулся с задачей в которой нужно назначить привилегии с ограничением на определенные даные.
Например имеем две таблицы (relation) В одной имеем Индекс и Имя Городов, а в другой эти же индекс и остальная информация. Нужно назначить GRANT SELECT на таблицу где колонка city содержит только "Roseville" и "Rocklin".

К сожалению следующее выражение не работает. Ошибка с "WHERE"
Код
GRANT SELECT ON table_tbl 
TO userName 
WHERE city = 'Rocklin' 
AND city = 'Roseville' 
AND zips.zipcode = table_tbl.zip;
Смотрел документацию по GRANT https://www.postgresql.org/doc... grant.html , но тут вобще нету ничего по поводу выборки с "WHERE". Подскажите как это реализовать.

Спасибо!
0
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
08.07.2016, 03:23 16
GRANT можно назначить на отдельные колонки (см. второе сверху определение в документации).
По поводу конкретных данных, такого нет.
Возможно в качестве решения подойдет создание представлений с заданной выборкой, на которое уже можно назначить GRANT.
То есть делаем
SQL
1
CREATE VIEW table1_restricted AS SELECT .... FROM table1 WHERE DATA="myvalue";
Потом делаем
SQL
1
GRANT SELECT ON table1_restricted TO ...
При это к основной таблице table1 у пользователя не должно быть доступа.
1
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
08.07.2016, 04:19  [ТС] 17
Да спасибо! я так и сделал, просто думал что должна быть возможность назначения на строки.
0
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
21.07.2016, 07:29  [ТС] 18
Подскажите в какой программе создается дизайн базы даных? Например вот этот http://wiki.sahanafoundation.o... :sqlschema

Или посоветуйте что нибудь для этой цели на английском языке.
0
1240 / 959 / 379
Регистрация: 02.09.2012
Сообщений: 2,925
21.07.2016, 07:59 19
Честно говоря однозначного ответа на этот вопрос нет. Я в своей практике использовал как минимум три средства: ERwin data modeler, dbschema и встроенное в PgAdmin средство. Конечно, ERwin data modeler - это монстр с мегавозможностями и мегаценой. dbschema поскромнее и ценник нормальный. PgAdmin по сравнению с ними глючное убожество, но простенькую базу спроектировать можно.

Еще немного пытался пользоваться SQL Power Architect. Вот, можете на него обратить внимание, community edition этого продукта доступна для скачивания.

Все "монстры" на выбор перечислены здесь.
1
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 26
21.07.2016, 09:43  [ТС] 20
Спасибо большое!

Добавлено через 3 минуты
Нашел ERwin Data Modeler Community Edition тоже попробую что за монстр, хотя с моими базовыми знаниями я наверное не смогу еще его оценить по достоинству =)
0
21.07.2016, 09:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2016, 09:43
Помогаю со студенческими работами здесь

Файл pgpass, запуск psql от имени другого пользователя без ввода пароля
Написал скрипт на питоне, который выдирает с базы данных информацию. Так как линукс сервер рабочий,...

Несколько заданий
Помогите пожалуйста! №1 Найдите все значения а, при которых неравенство не имеет решений!...

Несколько заданий
1. Вычислить площадь равнобедренного треугольника с основанием А S = 1/2*A*(корень(B^2-(A^2/4)))...

Несколько заданий
Здравствуйте! Прошу у вас помощи ребята! Я в маткате новичок, познакомился с ним только вчера....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru