@David138

Как правильно сделать запрос в постгресе?

привет. Как мне выполнить Select в Postgresql чтобы можно было вывести все столбцы inventory и device?
в Учебных целях создал себе базу данных.
В первой таблице у меня инветаризация, устройства, кабинеты, количество и дата:
+====+=============+===========+===========+==========+=====================+
| id | inventory   | device_id | office_id | quantity | date                |
+====+=============+===========+===========+==========+=====================+
| 1  | 5661        | 1         | 1         | 1        | 2017-12-12 12:12:12 |
+----+-------------+-----------+-----------+----------+---------------------+
| 2  | (null)      | 2         | 1         | 1        | 2017-12-12 12:12:12 |
+----+-------------+-----------+-----------+----------+---------------------+
| 3  | 6787        | 3         | 1         | 1        | 2017-12-12 12:12:12 |
+----+-------------+-----------+-----------+----------+---------------------+
| 4  | 6768        | 4         | 1         | 1        | 2017-12-12 12:12:12 |
+----+-------------+-----------+-----------+----------+---------------------+
...
| 21 | 7888        | 21        | 2         | 1        | 2020-03-12 12:12:12 |
+----+-------------+-----------+-----------+----------+---------------------+
| 22 | (null)      | 22        | 2         | 1        | 2021-09-12 12:12:12 |
+----+-------------+-----------+-----------+----------+---------------------+
| 23 | (null)      | 23        | 2         | 4        | 2017-12-12 12:12:12 |
+----+-------------+-----------+-----------+----------+---------------------+
| 24 | 6756        | 24        | 2         | 1        | 2021-12-12 12:12:12 |
+----+-------------+-----------+-----------+----------+---------------------+
| 25 | 7675        | 24        | 2         | 1        | 2021-12-12 12:12:12 |
+----+-------------+-----------+-----------+----------+---------------------+

Во второй таблице у меня устройства и их названия:
+====+=================================================+======================================+
| id | device                                          | title                                |
+====+=================================================+======================================+
| 1  | Atc                                             | Panasonic kx-tda100ru                |
+----+-------------------------------------------------+--------------------------------------+
| 2  | Bидеокамера белая                               | (null)                               |
+----+-------------------------------------------------+--------------------------------------+
| 3  | Интерактиная доска с короткофокусным проектором | Promethean activeboard i78 mount dlp |
+----+-------------------------------------------------+--------------------------------------+
| 4  | Колонки                                         | Sven sps-605                         |
+----+-------------------------------------------------+--------------------------------------+
| 5  | Компьютер                                       | Nuc                                  |
...
+----+-------------------------------------------------+--------------------------------------+
| 20 | Эран моторизированный                           | Projecta compact electrol            |
+----+-------------------------------------------------+--------------------------------------+
| 21 | Ноутбук                                         | Acer aspire as5560g-4333g32mn        |
+----+-------------------------------------------------+--------------------------------------+
| 22 | Bидеокамера серая                               | (null)                               |
+----+-------------------------------------------------+--------------------------------------+
| 23 | Микрофон                                        | Shure sh58                           |
+----+-------------------------------------------------+--------------------------------------+
| 24 | Акустическая система                            | Mackie sr1530z                       |
+----+-------------------------------------------------+--------------------------------------+
| 25 | Сетевой фильтр                                  | Sven optima                          |
+----+-------------------------------------------------+--------------------------------------+
| 26 | Сетевой фильтр                                  | Surge protector                      |
+----+-------------------------------------------------+--------------------------------------+
| 27 | Мультимедийный проектор                         | Optima ex612                         |
+----+-------------------------------------------------+--------------------------------------+
| 28 | Экран настенный                                 | Screenmedia economy-p                |
+----+-------------------------------------------------+--------------------------------------+
| 29 | Колонки                                         | Logitech s120                        |
+----+-------------------------------------------------+--------------------------------------+
| 30 | Компьютер                                       | Nuc mini pc kit                      |
+----+-------------------------------------------------+--------------------------------------+
| 31 | Сетевой фильтр                                  | Pc pet                               |
+----+-------------------------------------------------+--------------------------------------+
| 32 | Интерактиная доска                              | 80                                   |
+----+-------------------------------------------------+--------------------------------------+
| 33 | Короткофокусный проектор                        | Benq                                 |
+----+-------------------------------------------------+--------------------------------------+
| 34 | Колонки                                         | Microlab solo 1                      |
+----+-------------------------------------------------+--------------------------------------+

Создавал я таблицы таким образом:
CREATE TABLE offices (
  id SERIAL PRIMARY KEY,
  office VARCHAR,
  building VARCHAR
);
CREATE TABLE devices (
  id SERIAL PRIMARY KEY,
  device VARCHAR,
  title VARCHAR
);
CREATE TABLE inventories (
  id SERIAL PRIMARY KEY,
  inventory VARCHAR,
  device_id INT REFERENCES devices(id),
  office_id INT REFERENCES offices(id),                                               
  quantity INT,                                                   
  date TIMESTAMP
);

Select делаю таким образом:
SELECT inventory, device, title  
FROM inventories 
INNER JOIN devices
ON inventories.id = devices.id;

Но он мне выдает неверную таблицу
+=============+=================================================+======================================+
| inventory   | device                                          | title                                |
+=============+=================================================+======================================+
| 5661        | Atc                                             | Panasonic kx-tda100ru                |
+-------------+-------------------------------------------------+--------------------------------------+
| (null)      | Bидеокамера белая                               | (null)                               |
+-------------+-------------------------------------------------+--------------------------------------+
| 6787        | Интерактиная доска с короткофокусным проектором | Promethean activeboard i78 mount dlp |
+-------------+-------------------------------------------------+--------------------------------------+
| 6768 | Колонки                                                | Sven sps-605                         |
+-------------+-------------------------------------------------+--------------------------------------+
...
| 7888        | Ноутбук                                         | Acer aspire as5560g-4333g32mn        |
+-------------+-------------------------------------------------+--------------------------------------+
| (null)      | Bидеокамера серая                               | (null)                               |
+-------------+-------------------------------------------------+--------------------------------------+
| (null)      | Микрофон                                        | Shure sh58                           |
+-------------+-------------------------------------------------+--------------------------------------+
| 6756        | Акустическая система                            | Mackie sr1530z                       |
+-------------+-------------------------------------------------+--------------------------------------+
| 7675        | Сетевой фильтр                                  | Sven optima                          |
+-------------+-------------------------------------------------+--------------------------------------+

в инвентарном номере 7675 должно быть устройство Акустическая система Mackie sr1530z а не сетевой фильтр. как будто он сортирует по inventory а не по устройствам, или таблицу я как то не так создал. Как проблему решить?
  • Вопрос задан
  • 73 просмотра
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
Вы написали
ON inventories.id = devices.id;
Объединять по паре serial, конечно, можно и база честно выполнит такой запрос. Но обычно из этого не получается ничего полезного для ипользования. Может быть вы хотели сказать inventories.device_id = devices.id?
Ответ написан
@kalapanga
как будто он сортирует по inventory а не по устройствам
Слово "сортирует" здесь совсем неуместно. У Вас никто нигде ничего не сортирует.
У Вас неправильное условие для JOIN. Скорее всего должно быть:
ON inventories.device_id = devices.id
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы