用于从链接表中检索最后一条记录的SQL查询

时间:2016-05-20 13:30:35

标签: sql sql-server greatest-n-per-group

我写了一个查询来比较不同表格中的2列(TRELAY VS TUSERDEF8)。查询工作得很好,除了它检索TUSERDEF8表中与TRELAY表有多对一关系的顶级记录。

表格由TRELAY.ID = TUSERDEF8.N01链接。我想从TUSERDEF8检索最新记录,并将该记录与TRELAY记录进行比较。我计划使用索引列的最大值(TUSERDEF8.ID)来确定最新记录。

我正在使用SQL Server。

我的代码如下,但我不确定如何更改查询以检索最后TUSERDEF8条记录。任何帮助表示赞赏。

SELECT 
    TRELAY.ID, TRELAY.S15, 
    TUSERDEF8.S04, TUSERDEF8.N01, TUSERDEF8.S06
FROM 
    TRELAY
INNER JOIN 
    TUSERDEF8 ON TRELAY.ID = TUSERDEF8.N01
WHERE 
    LEFT(TRELAY.S15, 1) <> LEFT(TUSERDEF8.S04, 1)
    AND NOT (TRELAY.S15 LIKE '%MEDIUM%' AND
             TUSERDEF8.S04 LIKE '%N/A%' AND
             TUSERDEF8.S06 LIKE '%EACMS%')

4 个答案:

答案 0 :(得分:0)

我相信你的预期输出仍然有点含糊不清。

听起来我只想要输出TUSERDEF8.ID最大的记录。如果这是正确的,那么试试这个:

SELECT TRELAY.ID, TRELAY.S15, TUSERDEF8.S04, TUSERDEF8.N01, TUSERDEF8.S06
FROM TRELAY
  INNER JOIN TUSERDEF8 ON TRELAY.ID = TUSERDEF8.N01
WHERE LEFT(TRELAY.S15, 1) <> LEFT(TUSERDEF8.S04, 1)
  AND NOT (TRELAY.S15 LIKE '%MEDIUM%' AND
           TUSERDEF8.S04 LIKE '%N/A%' AND
           TUSERDEF8.S06 LIKE '%EACMS%')
  AND TUSERDEF8.ID IN (SELECT MAX(TUSERDEF8.ID) FROM TUSERDEF8)

编辑:在审核了您最近的评论之后,看起来这样会更合适:

SELECT 
  , C.ID
  , C.S15, 
  , D.S04
  , D.N01
  , D.S06
FROM (
    SELECT A.ID, A.S15, MAX(B.ID) AS MaxID
    FROM TRELAY AS A
    INNER JOIN TUSERDEF8 AS B ON A.ID = B.N01
    WHERE 
    LEFT(A.S15, 1) <> LEFT(B.S04, 1)
    AND NOT (A.S15 LIKE '%MEDIUM%' AND
             B.S04 LIKE '%N/A%' AND
             B.S06 LIKE '%EACMS%')
    GROUP BY A.ID, A.S15
) AS C
INNER JOIN TUSERDEF8 AS D ON C.ID = D.N01 AND C.MaxID = D.ID

答案 1 :(得分:0)

假设您的ID是int(s),那么以下可能有用吗?

SELECT TOP 1 TRELAY.ID, TRELAY.S15, TUSERDEF8.S04, TUSERDEF8.N01, TUSERDEF8.S06
FROM TRELAY INNER JOIN TUSERDEF8 
ON TRELAY.ID = TUSERDEF8.N01
WHERE LEFT(TRELAY.S15, 1) <> LEFT(TUSERDEF8.S04, 1)
AND NOT (
    TRELAY.S15 LIKE '%MEDIUM%' 
    AND TUSERDEF8.S04 LIKE '%N/A%' 
    AND TUSERDEF8.S06 LIKE '%EACMS%'
    )
ORDER BY TUSERDEF8.ID DESC

HTH

戴夫

答案 2 :(得分:0)

你可以这样做:

With cteLastRecord As
(
Select  S04, N01, S06, 
        Row_Number() Over (Partition By N01, Order By ID Desc) SortOrder 
    From TUSERDEF8
)
SELECT 
    TRELAY.ID, TRELAY.S15, 
    TUSERDEF8.S04, TUSERDEF8.N01, TUSERDEF8.S06
FROM 
    TRELAY
INNER JOIN 
    (Select S04, N01, S06 From cteLastRecord Where SortOrder = 1) TUSERDEF8 ON TRELAY.ID = TUSERDEF8.N01
WHERE 
    LEFT(TRELAY.S15, 1) <> LEFT(TUSERDEF8.S04, 1)
    AND NOT (TRELAY.S15 LIKE '%MEDIUM%' AND
             TUSERDEF8.S04 LIKE '%N/A%' AND
             TUSERDEF8.S06 LIKE '%EACMS%')

答案 3 :(得分:-1)

使用ID列确定哪一行是“最后一行”是个坏主意

使用像“TUSERDEF8”这样的神秘表名(与TUSERDEF7有什么不同)是一个非常糟糕的主意,还有像“S04”这样完全神秘的列名。

对表使用像“T”这样的前缀是一个坏主意 - 应该已经很清楚它是一个表。

现在所有这一切都已经完成了:

SELECT 
    R.ID,
    R.S15,
    U.S04,
    U.N01,
    U.S06
FROM 
    TRELAY R
INNER JOIN TUSERDEF8 U ON U.N01 = R.ID
LEFT OUTER JOIN TUSERDEF8 U2 ON
    U2.N01 = R.ID AND
    U2.ID > U.ID
WHERE
    U2.ID IS NULL AND    -- This will only happen if the LEFT OUTER JOIN above found no match, meaning that the row in U has the highest ID value of all matches
    LEFT(R.S15, 1) <> LEFT(U.S04, 1) AND
    NOT (
        R.S15 LIKE '%MEDIUM%' AND
        U.S04 LIKE '%N/A%' AND
        U.S06 LIKE '%EACMS%'
    )