SQL Server:加入2个表,更喜欢存在冲突的一个表的结果

时间:2014-03-17 09:27:44

标签: sql sql-server join

我的表格看起来像这样: -

tblConsuptionsFromA

  

ID米日期总
  1 1 2014年3月1日100.1
  2 1 2014年4月1日184.1
  3 1 2014年5月1日134.1
  4 1 2014年6月1日132.4
  5 1 07/01/2014 126.1
  6 1 08/01/2014 190.1

和...

tblConsuptionsFromB

  

ID米日期总
  1 1 2014年1月1日164.1
  2 1 2014年2月1日133.1
  3 1 2014年3月1日136.1
  4 1 2014年4月1日125.1
  5 1 2014年5月1日190.1
  6 1 2014年6月1日103.1
  7 1 07/01/2014 164.1
  8 1 2014年8月1日133.1
  9 1 2014年9月1日136.1
  10 1 2014年10月1日125.1
  11 1 11/01/2014 190.1

我需要加入这两个表,但如果两个表中同一天都有一个条目...只从tblConsumptionsFromA获取结果。

结果将是: -

  

ID从日期总
SOURCE_ID米   1个1 1乙2014年1月1日164.1
  2 2 1乙2014年2月1日133.1
  3 1 1甲2014年3月1日100.1
  4 2 1的2014年4月1日184.1
  5 3 1的2014年5月1日134.1
  6 4 1的2014年6月1日132.4
  7 5 1甲07/01/2014 126.1
  8 6 1的2014年8月1日190.1
  9 9 1乙2014年9月1日136.1
  10 10 1乙2014年10月1日125.1
  11 11 1 B 11/01/2014 190.1

这超出了我的范围,所以如果有人可以解决......我会非常感动。

4 个答案:

答案 0 :(得分:1)

这是一种方法:

SELECT
    COALESCE(a.source_id,b.source_id) as source_id,
    COALESCE(a.meter,b.meter) as meter,
    COALESCE(a.[from],b.[from]) as [from],
    COALESCE(a.[date],b.[date]) as [date],
    COALESCE(a.total,b.total)
FROM (select source_id,meter,'b' as [from],[date],total
       from tblConsuptionsFromB) b
         left join
     (select source_id,meter,'a' as [from],[date],total
       from tblConsuptionsFromA) a
         on
            a.meter = b.meter and
            a.[date] = b.[date]

不幸的是,没有像COALESCE(a.*,b.*)这样的简写来将COALESCE应用于所有列

答案 1 :(得分:0)

select ta.id, tb.id, ta.meter,
    if(ta.date is null, 'B', 'A') as from,
    if(ta.date is null, tb.date, ta.date) as date,
    if(ta.date is null, tb.total, ta.total) as total
from tblConsuptionsFromA ta
    full join tblConsuptionsFromB tb on ta.date=tb.date

答案 2 :(得分:0)

您需要对2个表进行联合,并从tblConsuptionsFromA中出现的tabletblConsuptionsFromB中排除记录,如:

Select Id, Source_ID, meter, 'A' From, Date, Total 
  FROM tblConsuptionsFromA

Union All

Select Id, Source_ID, meter, 'B' From, Date, Total 
  FROM tblConsuptionsFromB
Where Date NOT EXISTS (Select Date from tblConsuptionsFromA)

答案 3 :(得分:0)

UNION运算符用于组合两个或多个SELECT语句的结果集。

 SELECT column_name(s) FROM table1
 UNION
 SELECT column_name(s) FROM table2;

UNION的文件在这里: http://www.w3schools.com/sql/sql_union.asp

ROW_NUMBER()返回结果集分区中行的序号,从1开始,每个分区的第一行。

 ROW_NUMBER ( ) 
    OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

ROW_NUMBER()的文档在这里: http://technet.microsoft.com/en-us/library/ms186734.aspx

以下SQL语句使用UNION从“tblConsuptionsFromA”中选择所有记录,从“tblConsuptionsFromB”表中选择部分记录。

SELECT ROW_NUMBER() OVER(ORDER BY DATE ASC) AS 'id', 
id AS 'source_id',meter, date,t AS 'from',total 
FROM(
    SELECT id,meter, date, 'A' AS t, total FROM tblConsuptionsFromA
UNION 
    SELECT id,meter, date, 'B' AS t,total FROM tblConsuptionsFromB
    WHERE NOT date IN (SELECT date FROM tblConsuptionsFromA) 
) AS C;

希望这有帮助。