Примеры запросов в отношениях "многие ко многим"
Ничего себе, трудно найти простое объяснение этой теме. Простое соотношение "многие-ко-многим".
Три таблицы, tableA, tableB и таблица соединений A_B.
Я знаю, как настроить отношения, с ключами и всеми, но я немного смущен, когда приходит время выполнять запросы INSERT, UPDATE и DELETE....
В принципе, я ищу пример, который показывает:
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