Примеры запросов в отношениях "многие ко многим"

Ничего себе, трудно найти простое объяснение этой теме. Простое соотношение "многие-ко-многим".

Три таблицы, tableA, tableB и таблица соединений A_B.

Я знаю, как настроить отношения, с ключами и всеми, но я немного смущен, когда приходит время выполнять запросы INSERT, UPDATE и DELETE....

В принципе, я ищу пример, который показывает:

  • Как получить все записи в таблице A на основе идентификатора в TableB

  • Как получить все записи в TableB на основе ID в таблицеA

3 Как вставить в таблицу TableA или TableB, а затем сделать соответствующий INSERT в таблице соединений, чтобы сделать соединение.

Я не ищу решение для конкретного проекта, а всего лишь несколько общих примеров, которые могут быть применены. Может быть, у вас что-то лежит?

Ответ 1

Первое, что я хотел бы сделать, это рекомендовать использовать ORM, например Linq-To-Sql или NHibernate, который даст вам объектные представления вашей модели данных, которые упрощают обработку сложных вещей, таких как операции множественного числа CRUD.

Если ORM не является частью вашего набора инструментов, вот как это будет выглядеть в SOL.

Users       UserAddresses     Addresses
=======     =============     =========
Id          Id                Id
FirstName   UserId            City
LastName    AddressId         State
                              Zip

Наши таблицы объединены следующим образом:

   Users.Id -> UserAddresses.UserId
   Addresses.Id -> UserAddresses.AddressId
  • Все записи в User на основе Addresses.Id
SELECT        Users.*
FROM            Addresses INNER JOIN
                         UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN
                         Users ON UserAddresses.UserId = Users.Id
WHERE        (Addresses.Id = @AddressId)
  • Все записи в адресах на основе Users.Id
SELECT        Addresses.*
FROM            Addresses INNER JOIN
                         UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN
                         Users ON UserAddresses.UserId = Users.Id
WHERE        (Users.Id = @UserId)

Ответ 2

SELECT *
FROM a
WHERE id IN (SELECT aid FROM ab WHERE bid = 1234)

или

SELECT a.*
FROM a
JOIN ab ON a.id = ab.aid
WHERE ab.aid = 12345

Вставить, это зависит от вашей базы данных (например, являются ли первичные ключи из последовательностей, автоматически сгенерированы или сгенерированы каким-либо другим способом или просто составные клавиши). Но вам просто нужно:

Для этих данных:

INSERT INTO a VALUES (...)

Для отношения:

INSERT INTO ab VALUES (...)

Ответ 3

Чтобы получить все записи в таблице A на основе ключа в B, на английском языке вам нужны записи в таблице A, которые имеют запись Join с этим ключом TableB (Предположим, что tableA_B имеет два столбца Foreign Key, (TabAFK и TabBFK)

  Select * from TableA A
  Where pK In (Select Distinct TabAFK From tableA_B
                Where TabBFK = @TableBKeyValue)

То же самое для другого направления

  Select * from TableB B
  Where pK In (Select Distinct TabBFK From tableA_B
                Where TabAFK = @TableAKeyValue)

Чтобы вставить новую запись, сделайте обычную вставку в TableA и TableB по мере необходимости... Вставки в таблицу соединений (tableA_B) - это всего лишь два pks из двух основных таблиц

   Insert TableA (pk, [other columns]) Values(@pkValue,  [other data)
   Insert TableB (pk, [other columns]) Values(@pkValue,  [other data)

- Затем вставьте в таблицу Join для каждой существующей ассоциации...

  Insert tableA_B (TabAFK, TabBFK)  Values(@PkFromA,  @PkFromB)  

Ответ 4

1) выбрать таблицаA. * из таблицаA join таблицаA_B на столеA.id = таблицаA_B.idA где tableA_B.idB = somevalue

2) выбрать таблицаB. * из таблицаB левый join таблицаA_B на таблицеB.id = таблицаA_B.idB где tableA_B.idA = некоторое значение

3) вставка зависит от вашей базы данных, но вставляем ее в a, вставляем в b, а затем вставляем в a_b; даже с ограничениями на таблицы он должен работать таким образом.

Подсказка: не используйте оператор IN для 1/2