Синтаксис SQL (INSERTS с несколькими внешними ключами) - PullRequest
1 голос
/ 22 ноября 2010

Если я хочу вставить запись при поиске внешнего ключа, я могу сделать это с помощью:

INSERT INTO stores_products (name, product_id)
SELECT 'storeABC',
       id 
  FROM products 
 WHERE name = 'product123';

(где product_id - это внешний ключ к таблице продуктов)

Однако я не могу понять синтаксис, когда мне нужно искать внешние ключи из нескольких таблиц.

Например, я хочу сделать что-то вроде:

INSERT INTO stores_products 
  (name, product_id, owner_id)
SELECT 'storeABC', products.id, owners.id 
 FROM products 
WHERE name = 'product123' 
 FROM owners 
WHERE name = 'owner456';

(имена таблиц и столбцов являются лишь примером, я знаю, что это не совсем имеет смысла с точки зрения проектирования базы данных, но мой вопрос касается синтаксиса ...) Спасибо.

Ответы [ 3 ]

5 голосов
/ 22 ноября 2010

Если между записями PRODUCTS и OWNERS нет связи, используйте:

INSERT INTO STORE_PRODUCTS
  (name, product_id, owner_id)
SELECT 'storeABC',
       p.id,
       (SELECT o.id
          FROM OWNERS o
         WHERE o.name = 'owner456')
  FROM PRODUCTS p
 WHERE p.name = 'product123'

В противном случае, если есть связь между таблицей OWNERS и PRODUCTS - вы должны указать ее с помощью JOIN:

INSERT INTO STORE_PRODUCTS
  (name, product_id, owner_id)
SELECT 'storeABC',
       p.id,
       o.id           
  FROM PRODUCTS p
  JOIN OWNERS o ON o.relation_to_product_col = p.relation_to_owner_col
 WHERE p.name = 'product123'
   AND o.name = 'owner456'

Ссылка:

1 голос
/ 06 декабря 2010

Если [products.name] и [owners.name] уникальны, вы можете сделать декартово объединение, используя ключевое слово cross join .Результатом будет одна строка, содержащая идентификаторы, которые вы ищете.

insert 
  into stores_products(name, product_id, owner_id)
select 'storeABC' as name
       ,products.id
       ,owners.id 
 from products cross join owners
where products.name = 'product123' 
  and owners.name   = 'owner456';
0 голосов
/ 22 ноября 2010

Попробуйте сделать это так:

Последнее обновление:

INSERT INTO stores_products 
  (name, product_id, owner_id)
SELECT 'storeABC', 
       products.id, 
       owners.id 
  FROM products, owners 
    WHERE products.name = 'product123' 
AND WHERE owners.name = 'owner456';
...