CREATEDATABASEtest;
usetest;
CREATETABLE A (
a_id int,
namevarchar(255),
typeint
);
CREATETABLE B (
b_id int,
namevarchar(255),
a_id int
);
INSERTINTO A VALUES (1, '张三',1);
INSERTINTO A VALUES (2, '张三',2);
INSERTINTO A VALUES (3, '张三',1);
INSERTINTO B VALUES (1,'张三',1);
INSERTINTO B VALUES (2,'张三',3);
INSERTINTO B VALUES (3,'张三',3);
-- 第一种SELECT
A.a_id,
A.name,
A.type,
B.b_id,
B.a_id as b_a_id
FROM A
LEFTJOIN B ON (B.a_id = A.a_id and A.type=1)
or (B.name = A.name and A.type=2)
ORDERBY A.a_id, B.b_id;
-- 第二种SELECT
A.a_id,
A.name,
A.type,
B.b_id,
B.a_id as b_a_id
FROM A
LEFTJOIN B ON B.a_id = CASEWHEN A.type = 1THEN A.a_id
WHEN A.type = 2THEN (
SELECT a_id
FROM A AS A_ref
WHERE A_ref.name = A.name
AND A_ref.type = 1LIMIT1
)
ENDORDERBY A.a_id, B.b_id;
-- 第三种SELECT
A_main.a_id,
A_main.name,
A_main.type,
B.b_id,
B.a_id as b_a_id
FROM A AS A_main
LEFTJOIN (
-- 为type=2的记录找到对应的type=1记录的a_idSELECT
A2.a_id AS original_a_id,
A1.a_id AS linked_a_id
FROM A AS A2
INNERJOIN A AS A1
ON A2.name = A1.name
AND A1.type = 1WHERE A2.type = 2
) AS link_table ON A_main.type = 2AND A_main.a_id = link_table.original_a_id
LEFTJOIN B ON
(A_main.type = 1AND B.a_id = A_main.a_id) OR
(A_main.type = 2AND B.a_id = link_table.linked_a_id)
ORDERBY A_main.a_id, B.b_id;