【问题标题】:SQL Server Join Different table with same columns nameSQL Server加入具有相同列名的不同表
【发布时间】: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


【解决方案1】:

那是因为你可能想试试Coalesce ...

这是一个sn-p

SELECT COALESCE(TableA.Id,TableB.Id)'Id'
      , TableA.ContractNo  '32'
      , TableA.zone 'zone-2012'
      , TableA.inspect 'inspect-2012'
      , TableB.ContractNo  'xx'
      , TableB.zone 'zone-2009'
      , TableB.inspect 'inspect-2009'
INTO NewTable
FROM TableC a
FULL JOIN TableC b
   ON TableA.Id = TableB.I

你应该能够适应它得到你想要的结果!

【讨论】:

  • 如果表 B 中有 2 行具有相同的 ContractNo,表 C 中有 3 行,则结果为 6 行。我想要的是 3 行。
【解决方案2】:

根据您的样本数据

SELECT A.contractno,
       A.contractno,
       B.id,
       B.[column a],
       C.id,
       C.contractno,
       C.[column a],
       C.[column b]
  FROM [Table A] A
  LEFT OUTER JOIN [Table C] C
    ON A.ContractNo = C.ContractNo
  LEFT OUTER JOIN [Table B] B
    ON B.ContractNo = C.ContractNo
   AND B.[column a] = C.[column a]

结果

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

【讨论】:

    猜你喜欢
    • 2020-04-08
    • 2022-01-15
    • 2016-03-24
    • 1970-01-01
    • 2013-05-26
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多