sql-server - transact-SQl 查询左连接两个表并从表中获取所有数据
问题描述
假设我有两个表,如下例所示
TableA
A_Id | A_Value | A_Number
1 AAA 111
2 BBB 222
3 CCC 333
TableB
B_Id | A_Id | B_Value | B_Number
1 1 XXX 999
2 2 YYY 888
3 NULL ZZZ 777
如您所见,A_Id是TableA的主键和TableB的外键。
我想要的结果是加入这两个表,从 TableA 中获取所有行并相交行。
要求的结果
A_Id | A_Value | A_Number | B_Id | B_Value | B_Number
1 AAA 111 1 XXX 999
2 BBB 222 2 YYY 888
0 AAA 111 0 '' 0 <= this row is missing
0 BBB 222 0 '' 0 <= this row is missing
0 CCC 333 0 '' 0
如您所见,前两行是相交的行,接下来的三行都是TableA中的所有行。
我已经尝试过离开加入
select A.*, B.* from FROM TableA A
LEFT OUTER JOIN
TableB B on A.A_Id = B.A_Id
但缺少第三和第四行。
我怎样才能得到这样的结果?
注意:您可以忽略空值/零值,因为我已经使用了 ISNULL。
解决方案
在您的“示例结果”(上图)中,您似乎想要一些不同的东西(不是 LEFT JOIN)。看起来您需要匹配来自 TableA 和 TableB 的记录,并且再次需要来自 TableA 的所有内容。您可以使用 UNION 语句来做到这一点。像这样:
SELECT A.*, B.B_Id, B.B_Value, B.B_Number
FROM TableA A INNER JOIN TableB B on A.A_Id = B.A_Id
UNION
SELECT *, 0 AS B_id, '' AS B_Value, 0 AS B_Number
FROM TableA
推荐阅读
- html - 将 flexbox 列中的一些项目显示为行
- django - 获取错误 DecimalFields 必须定义一个 'max_digits' 属性
- python - 添加两个带孔的阵列以填充另一个阵列中的孔
- node.js - 搜索具有特殊字符的字符串
- javascript - 如何使用 Execute Javascript 关键字单击 Robot Framework 中的元素
- php - Laravel ::当分页时,长度未定义
- java - Javax Cache 'put' 的 SQL 等效项(INSERT 或 UPDATE)
- selenium - 由于存在另一个标签,无法从 selenium 的跨度中捕获文本
- c++ - 清理后没有编译
- php - 是否可以在 Laravel 中多次使用传递的参数?