【问题标题】:SQL Server : removing duplicate column while joining tablesSQL Server:连接表时删除重复列
【发布时间】:2017-06-15 03:40:14
【问题描述】:

我有 4 个表,其中一列在所有表中都很常见。有没有一种方法可以创建一个视图,在该视图中我可以按同一列连接所有表,而我只能看到一次公共列。

假设我有 table1

Cust ID | Order ID | Product_Name

表2

Cust_ID | Cust_Name | Cust_Address

表3

Cust_ID | Cust_Acc | Acc_Type

表4

Cust_ID | Contact_Phone | Cust_Total_Ord

这是我用来连接表格的代码;

SELECT * 
FROM table1
LEFT JOIN table2 ON table1.Cust_ID = table2.Cust_ID
LEFT JOIN table3 ON table2.Cust_ID = table3.Cust_ID
LEFT JOIN table4 ON table3.Cust_ID = table4.Cust_ID

我得到所有表加入,我从每个表中看到Cust_ID,如下所示;

Cust ID| Order ID|Product_Name| Cust_ID| Cust_Name|Cust_Address| Cust_ID| Cust_Acc| Acc_Type|Cust_ID|Contact_Phone|Cust_Total_Ord

有没有办法删除重复的Cust_ID 列,还是我需要在SELECT 中写下每个列名?我总共有 50 多列,所以很难写完。

对不起,如果这是一个非常愚蠢的问题,我已经检查了以前的类似问题但无法弄清楚并感谢您的帮助。

【问题讨论】:

  • 了解 LEFT JOIN ON 返回的内容:INNER JOIN ON rows UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。

标签: sql sql-server join


【解决方案1】:

你需要先从三个表中选择列,然后像下面这样进行内连接

select 
  t1.cust_id, t1.col1, t1.col2, 
  t2.col1_table2, t2.col2_table2, 
  t3.col1_table3, t3.col2_table3
from
 table1 t1 
inner join
 table2 t2 on t1.cust_id = t2.cust_id
join table3 t3 on t1.cust_id = t3.cust_id

结果如下图所示

【讨论】:

  • 感谢您的回答,这很有帮助,但我的真实数据中有大约 40 个不同的列,这就是为什么我试图找出是否有更简单的方法,仍然非常感谢您花时间和创建此示例代码。
  • 听起来您只是不想进行大量输入 - 您可以使用像 SSMS 中的查询构建器工具来构建查询,然后复制和粘贴。 ;)
【解决方案2】:

您在所有表上都有公共列,因此可以使用 using(common_column) 删除重复的列。

SELECT * 
FROM table1
LEFT JOIN table2 using(Cust_ID)
LEFT JOIN table3 using(Cust_ID)
LEFT JOIN table4 using(Cust_ID)

我觉得很有用。

【讨论】:

  • 最有用的答案。我真的很欣赏这种方法如何帮助减少从每个表中显式选择多个列名的麻烦。你能帮个小忙吗?请附上详细描述using()子句的参考链接。
  • 嗨,很抱歉迟到了。 docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljusing.html 这个 id 是我使用的 oracle 引用。
  • SQL Server(如原始问题)不支持 USING 子句
【解决方案3】:

不,你不能在 SQL Server 中轻松地做你想做的事。在其他数据库中,您可以使用using 子句。

您可以做的一件事是从除第一个表之外的所有表中显式选择列:

SELECT t1.*, . . .
FROM table1 t1 LEFT JOIN
     table2 t2
     ON t1.Cust_ID = t2.Cust_ID LEFT JOIN
     table3
     ON t1.Cust_ID = table3.Cust_ID LEFT JOIN
     table4
     ON t1.Cust_ID = table4.Cust_ID;

也许比列问题更重要,我改变了连接条件。您正在使用LEFT JOIN,因此第一个表是“驱动”表。当您说t2.Cust_ID = t3.Cust_Id 时,它仅在与table2 匹配时返回true。通常,您希望使用来自table1 的列,因为它是LEFT JOINs 链中的第一个。

【讨论】:

  • 感谢您的回答,我会在查询中更新
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2017-11-16
相关资源
最近更新 更多