【发布时间】:2017-08-26 22:32:58
【问题描述】:
我有3个数据库表,表A,表B,表C。表B和表C是不同的名称,具有相同的列名,表C有两列来自表b和表C的数据行可以是超过表B。
Table A
-----------------------------------
ContractNo | Contact
-----------------------------------
001 | AAA
Table B
---------------------------
ID | ContractNo | Column A
---------------------------
1 | 001 | Info A1
2 | 001 | Info A2
Table C
---------------------------------------
ID | ContractNo | Column A | Column B
---------------------------------------
6 | 001 | Info A1 | Info AA1
7 | 001 | Info A2 | Info AA2
8 | 001 | Info A3 | Info AA3
当我查询时:
SELECT * FROM tableA as A
INNER JOIN tableB AS B ON A.ContractNo = B.ContractNo
INNER JOIN tableC AS C ON A.ContractNo = C.ContractNo
WHERE A.ContractNo = '001'
结果:
-----------------------------------------------------------------------------
ContractNo | Contact | ID | Column A | ID | ContractNo | Column A | Column B
-----------------------------------------------------------------------------
001 | AAA | 1 | Info A1 | 6 | 001 | Info A1 | Info AA1
001 | AAA | 1 | Info A1 | 7 | 001 | Info A2 | Info AA2
001 | AAA | 1 | Info A1 | 8 | 001 | Info A3 | Info AA3
001 | AAA | 2 | Info A2 | 6 | 001 | Info A1 | Info AA1
001 | AAA | 2 | Info A2 | 7 | 001 | Info A2 | Info AA2
001 | AAA | 2 | Info A2 | 8 | 001 | Info A3 | Info AA3
预期结果:
ContractNo | Contact | ID | Column A | ID | ContractNo | Column A | Column B
-----------------------------------------------------------------------------
001 | AAA | 1 | Info A1 | 6 | 001 | Info A1 | Info AA1
001 | AAA | 2 | Info A2 | 7 | 001 | Info A2 | Info AA2
001 | AAA | NULL | NULL | 8 | 001 | Info A3 | Info AA3
如果表 B 中有 3 行数据,ContractNo = '001',表 C 中有 4 行 ContractNo = '001',结果我得到 12 行。预期结果 4 行。
【问题讨论】:
-
问题是连接。您从 a 加入到 b 并获得 2 行。然后从表 a 到 c 你得到 3 行。来自同一个父级的两个父级到子级的连接对 Sql 产生了乘法效应。它需要 2 行并将其乘以 3 行。这通常称为笛卡尔连接。更改字段名称,您将遇到同样的问题。
-
你没有在输入方面解释你想要输出什么行;您只需提供一些 错误 代码和一个您想要的示例,以及另一部分信息。请阅读minimal reproducible example 并采取行动。填写以下缺失的部分:行 (ContractNo_1,Contact,ID_1,Column_A_1,ID_2,...) 当行 (A.ContractNo,...) 在 tableA 和...和 A 中时在结果中。 ContractNo = B.ContractNo and ... or ... and A.ContractNo B.ContractNo and ID_1 IS NULL and Column_A_1 IS NULL ....Is there any rule of thumb to construct SQL query from a human-readable description?
标签: sql sql-server database sql-server-2008