2

我有一个如下表结构

idx   p_id    location_id  

1     CTX      A1
2     CTX      A2
3     ABC      A3
4     ABC      A1

idx 是自动递增编号,表示最新位置(对于产品 CTX 情况,它从 A1 转移到 A2)

现在,我要查找的是位置 A1 中的任何产品。我应该只找到产品 ABC,因为产品 CTX 从 A1 移动到 A2,它不再在 A1 中

有没有简单的方法来执行 SQL 查询?

4

4 回答 4

3

假设您要查找给定 p_id 的最大 dx 位置为“A1”的所有行

SELECT t.* 
FROM   table1 t 
       INNER JOIN (SELECT p_id, 
                          Max(dx) dx 
                   FROM   table1 
                   GROUP  BY p_id) max_dx 
               ON t.dx = max_dx.dx 
WHERE  t.location_id = 'A1' 

SQL小提琴

如果您由于某种原因不喜欢子查询,您可以对 PK 上的不等式执行 ANTI-JOIN

SELECT t.* 
FROM   table1 t 
       LEFT JOIN table1 t2
       ON t.p_id = t2.p_id 
          and t.dx < t2.dx
WHERE
     t2.dx IS NULL
     and t.location_id = 'A1'

SQL小提琴

于 2012-12-28T18:43:15.263 回答
1

好的,在重新阅读您的问题后,我认为这更需要您:

SELECT idx, p_id, location_id
FROM tablename t0 JOIN (
  SELECT MAX(idx) AS m
  FROM tablename
  GROUP BY p_id) t1
  ON t0.idx = t1.m
WHERE t0.location_id = 'A1';
于 2012-12-28T18:40:07.823 回答
0

最笨的方法:

SELECT TOP 1 PRODUCT_ID
FROM YOUR_TABLE
WHERE
 LOCATION_ID = "A1" -- of course use parameter in real application!
ORDER BY
 ID DESC

然而!这是不正确的,因为不能安全地依赖 IDS 的排序(即使它在 99% 的情况下都有效)。为什么不添加时间戳列?

您还可以使用 MAX() 函数来获取返回最大 ID 的子查询:

SELECT PRODUCT_ID
 FROM YOUR_TABLE
 WHERE
 LOCATION_ID = "A1" -- of course use parameter in real application!
AND
 ID = SLECT MAX(ID) FROM YOUR_TABLE WHERE LOCATION_ID = "A1"
于 2012-12-28T18:42:10.330 回答
0

您可以使用 ROW_NUMBER 获取最新位置,而无需使用相关子查询。

SELECT * FROM
(
    SELECT p_id, location_id, ROW_NUMBER() OVER(PARTITION BY p_id ORDER BY idx DESC) RowNumber
) x
WHERE RowNumber = 1 AND location_id = 'A1'
于 2012-12-28T18:44:27.007 回答