Соедините две таблицы, чтобы данные столбца внешнего ключа (целое число) изменились в текстовых данных из родительской таблицы (соответствующий столбец в родительской таблице не является первичным ключом) - PullRequest
1 голос
/ 16 февраля 2020

Я новичок в SQLite, и я все еще немного незнаком с объединением таблиц (и ограничениями в них). Я хотел бы знать, как объединить 2 таблицы, чтобы данные столбца в таблице B (несколько столбцов) изменились, чтобы отразить данные из таблицы A.

CREATE TABLE "A" (
      "person_id"   INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
      "person_name" TEXT NOT NULL,
      "email"   TEXT NOT NULL
);

    CREATE TABLE "B" (
          "company_id"  INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
          "company_name"    TEXT NOT NULL,
          "contact_one" INTEGER NOT NULL,
          "contact_two" INTEGER,
          "contact_three"   INTEGER,
          FOREIGN KEY("contact_one") REFERENCES "A"("person_id") ON DELETE SET NULL
          FOREIGN KEY("contact_two") REFERENCES "A"("person_id") ON DELETE SET NULL
          FOREIGN KEY("contact_three") REFERENCES "A"("person_id") ON DELETE SET NULL
);

Как мне написать запрос так, чтобы получилась таблица показывает столбцы "company_name", "contact_one", "contact_two" и "contact_three", НО с таблицами контактов, показывающими имя контакта, а не целое число (как оно будет отображаться в таблице B).

См. изображение ниже представляющие таблицы A и B и желаемый результат запроса SQLite:

Tables A and B and the desired output of SQLite query

Когда я выполняю левое соединение, запрос успешно выполняется только для одного столбца контакта.

SELECT B.company_name, A.person_name
FROM B
LEFT JOIN A ON B.contact_one = A.person_id

Я попытался добавить «ИЛИ» к запросу (я знаю, «И» не будет работать), но я получаю ошибку «неоднозначное имя столбца: A.person_name» при попытке запустить запрос:

SELECT B.company_name, A.person_name
FROM B
LEFT JOIN A ON B.contact_one = A.person_id
OR LEFT JOIN A ON B.contact_two = A.person_id
OR LEFT JOIN A ON B.contact_three = A.person_id

Как мне написать запрос, чтобы я мог получить contact_two и contact_three также в итоговой таблице с отображением имен всех трех контактов?

Любое руководство будет с благодарностью!

1 Ответ

1 голос
/ 16 февраля 2020

Вам нужно присоединиться к столу А 3 раза так:

SELECT B.company_name, 
  a1.person_name name1,
  a2.person_name name2,
  a3.person_name name3
FROM B
LEFT JOIN A a1 ON B.contact_one = a1.person_id
LEFT JOIN A a2 ON B.contact_two = a2.person_id
LEFT JOIN A a3 ON B.contact_three = a3.person_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...