SQL Server多重复主键表关联LEFT JOIN报错及正确实现求助
解决SQL关联表的语法错误与重复数据问题
一、先搞定语法错误
你遇到的"Incorrect syntax near the keyword 'LEFT'"是因为JOIN语句的基本结构写错了,和表的重复记录、AccountName的差异完全无关。
LEFT JOIN的正确写法必须先指定主表(FROM后面的表),再关联另一个表。比如你要以Table1为主表,关联Table2,正确语句框架是:
SELECT Table1.AccountID_T1 AS AccountID, Table1.Information, Table2.AccountName FROM Table1 LEFT JOIN Table2 ON Table1.AccountID_T1 = Table2.AccountID_T2;
如果要以Table2为主表,就调换FROM和JOIN的表位置:
SELECT Table2.AccountID_T2 AS AccountID, Table1.Information, Table2.AccountName FROM Table2 LEFT JOIN Table1 ON Table2.AccountID_T2 = Table1.AccountID_T1;
你之前写的LEFT JOIN Table1 ON AccountID_T1=AccountID_T2前面没有FROM 某个表,数据库根本不知道从哪开始查询,所以直接报错。
二、处理重复记录的问题
现在两个表都有重复的AccountID记录,直接关联会产生笛卡尔积:比如Table1里AccountID=1234的2条记录,会和Table2里同ID的3条记录一一匹配,最终得到6条结果。
如果需要去掉重复的组合,可以用DISTINCT:
SELECT DISTINCT Table1.AccountID_T1 AS AccountID, Table1.Information, Table2.AccountName FROM Table1 LEFT JOIN Table2 ON Table1.AccountID_T1 = Table2.AccountID_T2;
如果想让同一个AccountID只对应去重后的AccountName,可以先对Table2做去重处理再关联:
SELECT t1.AccountID_T1 AS AccountID, t1.Information, t2.AccountName FROM Table1 t1 LEFT JOIN ( SELECT DISTINCT AccountID_T2, AccountName FROM Table2 ) t2 ON t1.AccountID_T1 = t2.AccountID_T2;
如果同一个AccountID对应多个AccountName(比如你例子里的Client A和Client A International),可以用聚合函数选择其中一个,比如取最大/最小名称:
SELECT t1.AccountID_T1 AS AccountID, t1.Information, MAX(t2.AccountName) AS AccountName -- 换成MIN可取最小名称 FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.AccountID_T1 = t2.AccountID_T2 GROUP BY t1.AccountID_T1, t1.Information;
内容的提问来源于stack exchange,提问作者griffm
相关产品推荐
相关产品推荐

