左結合を使用して2つのテーブルを結合しようとしています。また、結果セットには、「右側」の結合テーブルの最初のレコードのみを含める必要があります。
次の2つのテーブルAとBがあるとします。
テーブル「A」
code | emp_no
101 | 12222
102 | 23333
103 | 34444
104 | 45555
105 | 56666
テーブル「B」
code | city | county
101 | Glen Oaks | Queens
101 | Astoria | Queens
101 | Flushing | Queens
102 | Ridgewood | Brooklyn
103 | Bayside | New York
期待される出力:
code | emp_no | city | county
101 | 12222 | Glen Oaks | Queens
102 | 23333 | Ridgewood | Brooklyn
103 | 34444 | Bayside | New York
104 | 45555 | NULL | NULL
105 | 56666 | NULL | NULL
左の結合後、テーブル「B」の一致したレコードが1つしかないことに気付いた場合(どのレコードが一致したかは関係ありません)(1対多マッピングです)
テーブルBから最初に一致したレコードを選択し、他のすべての行を無視する必要があります。
助けてください!
ありがとう
少し遊んだ後、これは予想以上にトリッキーであることがわかりました!仮定して table_b
には、一意の単一の列(たとえば、単一フィールドの主キー)があり、次のようにできます。
SELECT table_a.code,
table_a.emp_no,
table_b.city,
table_b.county
FROM table_a
LEFT
JOIN table_b
ON table_b.code = table_a.code
AND table_b.field_that_is_unique =
( SELECT TOP 1
field_that_is_unique
FROM table_b
WHERE table_b.code = table_a.code
)
;
OUTER APPLY
データベースでサポートされている場合、OUTER APPLY
は効率的で簡潔なオプションです。
SELECT *
FROM
Table_A a
OUTER APPLY
(SELECT TOP 1 *
FROM Table_B b_1
WHERE b_1.code = a.code
) b
;
これにより、indeterminate最初に一致したレコードへの左結合が発生します。私のテストでは、他の投稿されたソリューション(MS SQL Server 2012)よりも高速であることが示されています。
最も高く投票された答えは私には正しくないと思われ、複雑すぎるようです。サブクエリのテーブルBのコードフィールドでグループ化し、グループごとの最大IDを選択します。
SELECT
table_a.code,
table_a.emp_no,
table_b.city,
table_b.county
FROM
table_a
LEFT JOIN
table_b
ON table_b.code = table_a.code
AND table_b.field_that_is_unique IN
(SELECT MAX(field_that_is_unique)
FROM table_b
GROUP BY table_b.code)
SQL Server 2005以降のバージョンを使用している場合は、 ranking を使用して目的を達成できます。特に、 ROW_NUMBER()
はあなたのニーズにうまく合っているようです:
WITH B_ranked AS (
SELECT
*,
rnk = ROW_NUMBER() OVER (PARTITION BY code ORDER BY city)
FROM B
)
SELECT
A.code,
A.emp_no,
B.city,
B.county
FROM A
LEFT JOIN B_ranked AS B ON A.code = B.code AND b.rnk = 1
OR
WITH B_unique_code AS (
select * from(
SELECT
*,
rnk = ROW_NUMBER() OVER (PARTITION BY code ORDER BY city)
FROM B
) AS s
where rnk = 1
)
SELECT
A.code,
A.emp_no,
B.city,
B.county
FROM A
LEFT JOIN B_unique_code AS B ON A.code = B.code
ruakhからの回答を修正しましたが、これはmysqlで完全に機能するようです。
SELECT
table_a.code,
table_a.emp_no,
table_b.city,
table_b.county
FROM table_a a
LEFT JOIN table_b b
ON b.code = a.code
AND b.id = ( SELECT id FROM table_b
WHERE table_b.code = table_a.code
LIMIT 1
)
;
Oracleでは次のことができます。
WITH first_b AS (SELECT code, min(rowid) AS rid FROM b GROUP BY code))
SELECT a.code, a.emp_no, b.city, b.county
FROM a
INNER JOIN first_b
ON first_b.code = a.code
INNER JOIN b
ON b.rowid = first_b.rid
こうやって:
Select * From TableA a
Left Join TableB b
On b.Code = a.Code
And [Here put criteria predicate that 'defines' what the first record is]
ねえ、都市と郡が一意であれば、それらを使用します
Select * From TableA a
Left Join TableB b
On b.Code = a.Code
And b.City + b.county =
(Select Min(city + county)
From TableB
Where Code = b.Code)
しかし、ポイントは、クエリプロセッサにmeansであることをfirstに伝えるために、そこに何らかの式を入れる必要があるということです。