データベースがANSI SQLをサポートしていると仮定し、Bに複数の行がある場合は、最後のものをb ased on ID:
with lastB (B_Id) as (
select max(id) from tableB group by A_id
),
BRows as (
select * from tableB
where Id in (select B_Id from lastB)
)
select a.field1, a.field2, a.fieldN,
b.field1, b.field2, b.fieldN
from tableA a
left join BRows b on a.Id = b.A_Id
編集:あなたはあなたの質問を編集し、最初のものを作成しました。それから、max()、min()を作るだけです。
with lastB (B_Id) as (
select min(id) from tableB group by A_id
),
BRows as (
select * from tableB
where Id in (select B_Id from lastB)
)
select a.field1, a.field2, a.fieldN,
b.field1, b.field2, b.fieldN
from tableA a
left join BRows b on a.Id = b.A_Id
編集:ここでは私が約束したMS SQLのサンプルです:
DECLARE @tableA TABLE (id INT, other VARCHAR(10));
DECLARE @tableB TABLE
(
id INT ,
A_Id INT ,
other VARCHAR(10)
);
INSERT @tableA
(id, other)
VALUES (1, 'v1'),
(2, 'v2'),
(3, 'v3'),
(4, 'v4');
INSERT @tableB
(id, A_Id, other)
VALUES (1, 2, 'v21'),
(2, 3, 'v31'),
(3, 3, 'v32'),
(4, 3, 'v33');
WITH fromB (B_Id)
AS (SELECT MIN(id)
FROM @tableB
GROUP BY A_Id
),
BRows
AS (SELECT *
FROM @tableB
WHERE id IN (SELECT B_Id
FROM fromB)
)
SELECT a.id AS A_Id ,
a.other AS A_Other ,
b.id AS B_Id ,
b.other AS B_Other
FROM @tableA a
LEFT JOIN BRows b ON a.id = b.A_Id;
結果:
A_Id A_Other B_Id B_Other
1 v1 NULL NULL
2 v2 1 v21
3 v3 2 v31
4 v4 NULL NULL
あなたが適切なタグを使用してデータベースを指定する必要があります。 –
http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-質問 – Strawberry
あなたが送るリンクはオフラインです – FlorisdG