说我有这些表:
TableA TableB:
id name id name
-- ---- -- ----
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja
当我Left Join
时,我得到以下内容:
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
但我想要的是一个不同的" Left Join
" ,我得到以下内容:
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
1 Pirate null null
2 Monkey null null
3 Ninja 4 Ninja
3 Ninja null null
4 Spaghetti null null
我如何获得这个增强的" Left Join
" ,它会返回所有左表条目的空记录以及连接的值?
答案 0 :(得分:2)
听起来我觉得这就是你要找的东西:
SELECT TableA.id, TableA.name, TableB.id, TableB.name
FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
UNION
SELECT id, name, null, null
FROM TableA
请注意,您不需要LEFT JOIN
,因为第二个查询不需要这样做。您要求INNER JOIN
结果以及包含TableA
数据的TableB
数据的记录。
答案 1 :(得分:0)
您将使用union all
。当然,ids存在问题。这样的事情可能有用:
select row_number() over (order by (select NULL)) as id, name, bid, bname
from ((select a.id, a.name, b.id as bid, b.name as bname
from tableA a inner join
tableB b
on a.name = b.name
) union all
(select a.id, a.name, NULL, NULL
from tableA a
)
) ab;
这不会保留第一个id
列。但话说回来,很难说这是为了什么。
编辑:
实际上,这可能会以您希望的方式保留它:
select id, name, bid, bname
from ((select a.id, a.name, b.id as bid, b.name as bname
from tableA a inner join
tableB b
on a.name = b.name
) union all
(select a.id + (max(id) over ()), a.name, NULL, NULL
from tableA a
)
) ab;