2017-07-31 11 views
1

これで木の木が見えず、シンプルだと確信しています。 は私がMS-SQLの最大IDと内部結合

表1

NiD  Name  
1  Peter 
2  John 
3  Arthur 

表2

ID NiD  Value  
1 1  5   
2 2  10 
3 3  10 
4 1  20 
5 2  15 

マックスは

NiD ID Value 
1  4  20 
2  5  15 
3  3  10 

答えて

0

これは、私はそれを行うだろうかですが、私は表2は、表1のレコードに対応するエントリがない場合IDValueNULLになると思う。

SELECT NiD, ID, [Value] 
FROM Table1 
OUTER APPLY (
    SELECT TOP 1 ID, [Value] 
    FROM Table2 
    WHERE Table1.NiD = Table2.NiD 
    ORDER BY [Value] DESC 
) AS Top_Table2 
+0

おかげで、欲しいものを反映して、選択リストを更新T2 'と' t2'を交換するゴードンのSQLを変更他のテーブルが依存しているので、内部結合を使用するために少し魅力的です。 – BigIWT

0

は、あなたが使用できる結果の結合されたテーブルに関連するレコードの最大IDを返すようにしようとしていますこの場合のrow_number()

select NiD, ID, Value 
from (select t2.*, 
      row_number() over (partition by NiD order by ID desc) as seqnum 
     from table2 t2 
    ) t2 
where seqnum = 1; 

table2にはすべてのIDがあるので、table1は必要ありません。

+0

あなたは名前が必要な場合は、INNERがt2.nid = table1.nid' ON TABLE1に参加して、あなたが働いていた –

0
CREATE TABLE Names 
(
    NID INT, 
    [Name] VARCHAR(MAX) 
) 

CREATE TABLE Results 
(
    ID INT, 
    NID INT, 
    VALUE INT 
) 

INSERT INTO Names VALUES (1,'Peter'),(2,'John'),(3,'Arthur') 
INSERT INTO Results VALUES (1,1,5),(2,2,10),(3,3,10),(4,1,20),(5,2,15) 

SELECT a.NID, 
     r.ID, 
     a.MaxVal 
FROM (
      SELECT NID, 
        MAX(VALUE) as MaxVal 
      FROM Results r 
      GROUP BY NID 
     ) a 
     JOIN Results r 
      ON a.NID = r.NID AND a.MaxVal = r.VALUE 
ORDER BY NID 
0

ここで私が使用しているものです同様の状況では、データセットが大きすぎない(1M行未満)場合、パフォーマンスは良好でした。

SELECT 
    table1.nid 
    ,table2.id 
    ,table2.value 
FROM table1 
INNER JOIN table2 ON table1.nid = table2.nid 
WHERE table2.value = (
    SELECT MAX(value) 
    FROM table2 
    WHERE nid = table1.nid) 
ORDER BY 1 
関連する問題