我有一个有这种布局的数据库......
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)
也许
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))
答案 1 :(得分: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
答案 2 :(得分: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
);