2013-12-07 45 views
0

我有这种布局的DB ...如何使用连接表中的特定行查找记录?

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

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

我需要找到(在同一时间和其他contracts列)通过它们的当前位置的name合同。

当前位置是最大的那个order_position

换句话说,我试图编写一个查询,它将根据location.name返回来自contracts的行。

通常这只是通过location.contract_idcontracts.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

表结构?指标?数据库引擎?解释计划?数据columes?索引基数? – 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 
相关问题