Left join 会增多数据记录条数的处理方案(SQL SERVER)

Left join 会增多数据记录条数的处理方案

A表 ,左连结到B表,如果B表中关联关键字不唯一时,A表的会增加记录条数,也就是B中关联关键字重复的行数(设为N),会在A表中有该关联关键字的记录会重复(N次)。

有两种解决方案

======第一方案 

  if not ViewExists(QryList.Connection, '收付款x') then
  begin
    STR := 'create view 收付款x  as ';
    STR := str +
      ' SELECT A.HTCODE,a.日期,A.收款,A.付款,B.承包人 ,B.项目名称,B.合同金额  from 收付款MX A ';
    STR := str +
      ' left join (select MAX(合同编号) as 合同编号,max(项目名称) as 项目名称,max(合同金额) as 合同金额,MAX(承包人) as 承包人 FROM CONTRACT  group by 合同编号) B ON trim(A.HTCODE)=trim(B.合同编号) B ON trim(A.HTCODE)=trim(B.合同编号) ';
    EXECSQL(QryList, STR);
  end;

这里用的GROUP BY 去重复

======第一方案 

(1)先建一个去重的视图

  if not ViewExists(QryList.Connection, '合同LIST') then
  begin
    STR := 'create view 合同LIST AS '
      + 'select MAX(合同编号) as 合同编号,max(项目名称) as 项目名称,max(合同金额) as 合同金额,MAX(承包人) as 承包人 FROM CONTRACT  group by 合同编号 ';
    EXECSQL(QryList, STR);
  end;

(2)再关联到去重的视图

  if not ViewExists(QryList.Connection, '收付款x') then
  begin
    STR := 'create view 收付款x  as ';
    STR := str +
      ' SELECT A.HTCODE,a.日期,A.收款,A.付款,B.承包人 ,B.项目名称,B.合同金额  from 收付款MX A ';
    STR := str +
      ' left join 合同LIST B ON trim(A.HTCODE)=trim(B.合同编号) ';
    EXECSQL(QryList, STR);
  end;

你可能感兴趣的:(Delphi,电脑技术,sqlserver)