Заполните пустую таблицу из 2 столбцов (обе ссылки на внешний ключ) данными, на которые ссылаются столбцы из 2 других таблиц PostgreSQL - PullRequest
0 голосов
/ 25 марта 2020

У меня есть 2 таблицы, на которые я ссылаюсь:

1) Practitioner:

+------+-------------------+---------------+
| PKey |     FullName      | PhonePersonal |
+------+-------------------+---------------+
|    2 | Dr. Albert Wong   |     126777744 |
|    3 | Dr. William Kwong |     155556666 |
|    4 | Dr. Jonathan Chan |    4567888888 |
|    5 | Dr. Alice Lim     |      66655532 |
|    6 | Dr. Jerry Wong    |     123455578 |
|    7 | Dr. Louis Lane    |     167844444 |
|    8 | Dr. Steven Teng   |     122223000 |
+------+-------------------+---------------+ 

2) Center:

+------+--------------+-----------------------------------+--------------+
| Pkey |     Name     |           AddressStreet           | AddressCity  |
+------+--------------+-----------------------------------+--------------+
|   10 | Klinik Satu  | 1, Jalan Harmoni, Taman Kesihatan | TTDI         |
|   11 | Klinik Dua   | 2, Jalan Harmoni, Taman Kesihatan | Pudu         |
|   12 | Klinik Tiga  | 3, Jalan Harmoni, Taman Kesihatan | Sentul       |
|   13 | Klinik Empat | 4, Jalan Harmoni, Taman Kesihatan | Sentul Timur |
|   14 | Klinik Lima  | 5, Jalan Harmoni, Taman Kesihatan | Cheras       |
|   15 | Klinik Enam  | 6, Jalan Harmoni, Taman Kesihatan | Bangsar      |
|   16 | Klinik Tujuh | 7, Jalan Harmoni, Taman Kesihatan | Brickfields  |
+------+--------------+-----------------------------------+--------------+

И Таблица Location, имеющая 2 внешних ключа, ссылающихся на столбцы:

  1. Loc_PractitionerId ссылка PractitionerId в таблице Practitioner.
  2. Loc_CenterId ссылка Center_Id в таблице Center.

Каков наилучший способ заполнить Location данными, на которые он / будет ссылаться?

Желаемый результат:

CREATE TABLE Location (

    Loc_PractitionerId  INTEGER  FOREIGN KEY,
    Loc_CenterId INTEGER  FOREIGN KEY
);

Как таковой:

+---------------------------+---------------------+
|  Loc_practitionerId INT   |  Loc_centerId INT   |
+---------------------------+---------------------+
| fkey data: PractitionerId | fkey data: CenterId |
| fkey data: PractitionerId | fkey data: CenterId |
| fkey data: PractitionerId | fkey data: CenterId |
| fkey data: PractitionerId | fkey data: CenterId |
| fkey data: PractitionerId | fkey data: CenterId |
| fkey data: PractitionerId | fkey data: CenterId |
| fkey data: PractitionerId | fkey data: CenterId |
+---------------------------+---------------------+

или с фиктивными данными, например:

+------------------------+------------------+
| Loc_practitionerId INT | Loc_centerId INT |
+------------------------+------------------+
|                      2 |               10 |
|                      3 |               11 |
|                      4 |               12 |
|                      5 |               13 |
|                      6 |               14 |
|                      7 |               15 |
|                      8 |               16 |
+------------------------+------------------+

Я попытался использовать следующий запрос:

 INSERT INTO "Location" ( "Loc_practitionerId", "Loc_centerId") 
 values 
    ((SELECT "PractitionerId" FROM "Practitioner"),
     (SELECT "CenterId" from "Center"))

Но получите:

ОШИБКА: более одной строки, возвращенной подзапросом, используемым в качестве выражения SQL состояние: 21000

Я использую PostgreSQL 12

Ответы [ 3 ]

0 голосов
/ 27 марта 2020

ОК, так что вы хотите построить каждую комбинацию. Вы получаете это с помощью CROSS JOIN ваших столов. Причина, по которой вы получаете эту ошибку, заключается в том, что вы вставили свой выбор в предложение values. Каждый элемент в этом предложении должен выдавать 0 или 1 строку, ваш выбор производит 1 строку для каждой строки в таблице. Решение состоит в том, чтобы исключить предложение значения. Проверьте формат, вы увидите, что это не нужно, просто выберите в порядке. Итак:

 insert into "Location" ( "Loc_practitionerId", "Loc_centerId") 
      select "PractitionerId", "Practitioner",
        from "Practioner"
       cross join "Center";

И избавьтесь от этих двойных кавычек.

0 голосов
/ 30 марта 2020

Вы можете использовать оконную функцию row_number(), чтобы связать 2 таблицы:

insert into Location(Loc_PractitionerId, Loc_CenterId)
select p.pkey, c.pkey
from (
  select pkey, row_number() over (order by pkey) rn
  from Practitioner
) p inner join (
  select pkey, row_number() over (order by pkey) rn
  from Center
) c 
on c.rn = p.rn

См. Демоверсию . Результаты:

| loc_practitionerid | loc_centerid |
| ------------------ | ------------ |
| 2                  | 10           |
| 3                  | 11           |
| 4                  | 12           |
| 5                  | 13           |
| 6                  | 14           |
| 7                  | 15           |
| 8                  | 16           |
0 голосов
/ 27 марта 2020

Кажется, вы хотите, чтобы перекрестное соединение было вставлено в таблицу местоположений:

INSERT INTO "Location" ( "Loc_practitionerId", "Loc_centerId") 
SELECT p."PractitionerId", c."CenterId" 
FROM "Practitioner" p
  cross join "Center" c;

Не имеет отношения к вашей проблеме, но: вам действительно следует избегать этих страшных кавычек идентификаторы. У них гораздо больше проблем, чем они того стоят.

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