2013-12-07 48 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 
相關問題