2013-12-07 3 views
0

У меня есть БД с этого макета ...Как найти записи, используя только определенные строки в объединенной таблице?

contracts 
--------- 
id 
name 
description 
# Etc... 

locations 
--------- 
id 
contract_id # FK to contracts.id 
name 
order_position 
# Etc... 

Мне нужно найти по контрактам с name их текущего местоположения (и от других contracts столбцов одновременно).

Текущее местонахождение с наибольшим order_position.

Другими словами, я пытаюсь написать запрос, который будет возвращать строки из contracts на основе location.name.

Обычно это простое соединение через location.contract_id и contracts.id.

Например, это будет простой случай, без дополнительного требования ...

SELECT c.* 
FROM contracts c, locations l 
WHERE 
    c.id = l.contract_id 
AND 
    c.name LIKE '%bay%' 
AND 
    l.name LIKE '%admin%'; 

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

Есть ли способ сделать это с помощью одного запроса?

+0

Можете ли вы добавить пример данных и ожидаемый результат? –

+0

Структура таблицы? Индексы? Двигатель базы данных? Объяснить план? Количества данных? Индексность? – symcbean

ответ

0

Я работал над ней еще немного, и обнаружили, что это решает проблему ...

SELECT c.* 
FROM contracts c, locations l 
WHERE 
    c.id = l.contract_id 
AND 
    c.name LIKE '%bay%' 
AND 
    l.name LIKE '%admin%' 
AND l.order_position = 
(
    SELECT MAX(order_position) 
    FROM `locations` 
    WHERE `contract_id` = c.id 
); 
0

Может

SELECT c.name FROM contracts c JOIN locations l ON c.id=l.contract_id 
AND c.name IN(SELECT name FROM locations 
WHERE locations.order_position IN(SELECT MAX(order_position) FROM locations GROUP BY locations.name)) 
0

Что-то, как это должно работать:

SELECT c.id, 
     c.name, 
     loc2.name, 
     loc2.order_position 
    FROM dbo.contracts c 
INNER JOIN (
    SELECT loc.contract_id, 
       MAX(loc.order_position) AS order_position 
     FROM locations loc 
    GROUP BY contract_id 
     ) loc 
    ON c.id = loc.contract_id 
    LEFT JOIN dbo.locations loc2 
    ON loc2.contract_id = loc.contract_id 
    AND loc2.order_position = loc.order_position 
Смежные вопросы