Как выбрать на основе ключа нескольких столбцов - PullRequest
1 голос
/ 22 февраля 2012

Я работаю с устаревшей базой данных, в которой для продуктов используется ключ из трех столбцов.Я хочу выбрать все продукты, которые имеют статус «А» или имеют соответствующую запись во второй таблице.Если бы это был первичный ключ из одного столбца (например, 'id'), я бы сделал это следующим образом:

SELECT * FROM `product` 
WHERE `status` = 'A'
       OR `id` IN (SELECT `foreign_key` FROM `table2`)

Хотя я не могу понять, как выполнить подвыбор IN-предложения с тремя ключами.Я полагаю, что могу объединить ключи вместе и сравнить строки, но это кажется ужасно неэффективным.Есть ли способ сделать это без объединения?

Ответы [ 4 ]

2 голосов
/ 22 февраля 2012

Вы можете СЛЕДУЕТ ПРИСОЕДИНИТЬСЯ к таблице product и table2 на составном ключе, затем <code>status = 'A' ИЛИ ​​table2. id НЕ НУЛЬ

A LEFT [OUTER] СОЕДИНЕНИЕможет быть быстрее, чем эквивалентный подзапрос, поскольку сервер может оптимизировать его лучше

1 голос
/ 22 февраля 2012

Выполнить левый переход:)

SELECT p.* FROM product p
LEFT JOIN table2 t2 on p.key1 = t2.key1 and p.key2 = t2.key2 and p.key3 = t2.key3
WHERE status = 'A' OR t2.key1 IS NOT NULL
1 голос
/ 22 февраля 2012
SELECT * FROM product p1
WHERE status = 'A'
   OR EXISTS (SELECT *
     FROM table2 t2
     WHERE t2.id = p1.foreign_key
     AND t2.other_key = p1.secret_key
     ...
     );
0 голосов
/ 22 февраля 2012

Вы можете использовать СОЮЗ:

SELECT * 
FROM   'product' 
WHERE  'status' = 'A'
UNION
SELECT * 
FROM   'product' 
       JOIN 'table2' 
       ON (product.id = table2.foreign_key 
       AND ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...