it-swarm.com.de

Verbinde dich mit t-sql nur mit dem "neuesten" Datensatz

Ich habe zwei Tische. Tabelle "B" hat eine Eins-zu-Viele-Beziehung zu Tabelle "A", was bedeutet, dass für einen Datensatz in Tabelle "A" viele Datensätze in Tabelle "B" vorhanden sind.

Die Datensätze in Tabelle "B" unterscheiden sich hauptsächlich durch ein Datum. Ich muss eine Ergebnismenge erstellen, die den Datensatz in Tabelle "A" enthält, der nur mit dem neuesten Datensatz in Tabelle "B" verknüpft ist. Zur Veranschaulichung ist hier ein Beispielschema:

Table A
-------
ID

Table B
-------
ID
TableAID
RowDate

Ich habe Probleme beim Formulieren der Abfrage, um die Ergebnismenge zu erhalten, für die ich Hilfe suche. Ich wäre sehr dankbar.

19
Joel Martinez
select a.*, bm.MaxRowDate
from (
    select TableAID, max(RowDate) as MaxRowDate
    from TableB
    group by TableAID
) bm
inner join TableA a on bm.TableAID = a.ID

Wenn Sie mehr Spalten aus Tabelle B benötigen, gehen Sie folgendermaßen vor:

select a.*, b.* --use explicit columns rather than * here
from (
    select TableAID, max(RowDate) as MaxRowDate
    from TableB
    group by TableAID
) bm
inner join TableB b on bm.TableAID = b.TableAID
    and bm.MaxRowDate = b.RowDate
inner join TableA a on bm.TableAID = a.ID
24
RedFilter
SELECT *
FROM tableA A
OUTER APPLY (SELECT TOP 1 * 
             FROM tableB B
             WHERE A.ID = B.TableAID
             ORDER BY B.RowDate DESC) as B
29
Philip Fourie
With ABDateMap AS (
    SELECT Max(RowDate) AS LastDate, TableAID FROM TableB GROUP BY TableAID
),
LatestBRow As (
    SELECT MAX(ID) AS ID, TableAID FROM ABDateMap INNER JOIN TableB ON b.TableAID=a.ID AND b.RowDate = LastDate GROUP BY TableAID
)
SELECT columns
FROM TableA a
INNER JOIN LatestBRow m ON m.TableAID=a.ID
INNER JOIN TableB b on b.ID = m.ID
3
Joel Coehoorn

der Join für Tabelle B ist optional. Dies hängt davon ab, ob andere Spalten vorhanden sind

SELECT
    *
FROM
    tableA A
    JOIN
    tableB B ON A.ID = B.TableAID
    JOIN
    (
    SELECT Max(RowDate) AS MaxRowDate, TableAID
    FROM tableB
    GROUP BY TableAID
    ) foo ON B.TableAID = foo.TableAID AND B.RowDate= foo.MaxRowDate
2
gbn

Nur aus Gründen der Klarheit und zum Wohle derer, die über diese alte Frage stolpern werden. Die akzeptierte Antwort würde doppelte Zeilen zurückgeben, wenn RowDate in Table B doppelt vorhanden ist. Ein sicherer und effizienter Weg wäre, ROW_NUMBER() zu nutzen:

Select a.*, b.* -- Use explicit column list rather than * here
From [Table A] a
Inner Join ( -- Use Left Join if the records missing from Table B are still required
    Select *,
        ROW_NUMBER() OVER (PARTITION BY TableAID ORDER BY RowDate DESC) As _RowNum
    From [Table B]
) b
On b.TableAID = a.ID
Where b._RowNum = 1
1
Y.B.

Versuchen Sie Folgendes:

    BEGIN

DECLARE @TB1 AS TABLE (ID INT, NAME VARCHAR(30) )
DECLARE @TB2 AS TABLE (ID INT, ID_TB1 INT, PRICE DECIMAL(18,2))

INSERT INTO @TB1 (ID, NAME) VALUES (1, 'PRODUCT X')
INSERT INTO @TB1 (ID, NAME) VALUES (2, 'PRODUCT Y')

INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (1, 1, 3.99)
INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (2, 1, 4.99)
INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (3, 1, 5.99)

INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (1, 2, 0.99)
INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (2, 2, 1.99)
INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (3, 2, 2.99)


SELECT A.ID, A.NAME, B.PRICE
  FROM @TB1 A
  INNER JOIN @TB2 B ON A.ID = B.ID_TB1 AND B.ID = (SELECT MAX(ID) FROM @TB2 WHERE ID_TB1 = A.ID)


END
0
Paulo Marques

Dadurch wird der neueste Datensatz mit JOIN abgerufen. Ich denke, das wird jemandem helfen

SELECT cmp.*, lr_entry.lr_no FROM 
(SELECT * FROM lr_entry ORDER BY id DESC LIMIT 1) 
lr_entry JOIN companies as cmp ON cmp.id = lr_entry.company_id
0