CREATE VIEW repair.view_info_bug_PT
AS
SELECT distinct dbo.tbl_info_bug.*,repair.view_info_plan_N_PT.Product_Type AS Product_Type
FROM dbo.tbl_info_bug JOIN repair.view_info_plan_N_PT ON  
repair.view_info_plan_N_PT.pihao=dbo.tbl_info_bug.pihao

解决方案 »

  1.   

    解释一下:你先前使用的是左外联接语法,正如你所说,左外联接是以左边的表中的数据为主,但这种联接后产生的结果,有可能比原表中的记录要多,因为联接时,会有重复的记录出现。你可以使用自然连接,查询满足Product_Type有效的记录。为防止出现重复记录,可以使用distinct 去掉重复值。
      

  2.   

    我加了distinct 也是没有少啊
    提个问题distinct 是纪录一模一样的地吗?
      

  3.   

    sorry 数据是少了,但是还是比tbl_info_bug多出13000多
    还有没有跟好的办法,谢谢
      

  4.   

    这个问题太简单了。我给你分析分析
    一、left join的连接原理是这样的
    1。left的左边的表,拿出一行然后和left右边表的所有行匹配,能匹配上的拿出来
    2。然后left左边的表,拿出下一行,进行同样的操作
    3。如果left左边的表的某行和left右边表中的所有行,都不匹配,也保留下来,只不过有的列为null
    4。根据你的问题,肯定有很多匹配的行
    5。当然会有很多的行了。
      

  5.   

    CREATE VIEW repair.view_info_bug_PT
    AS
    SELECT a.*,b.Product_Type AS Product_Type
    FROM dbo.tbl_info_bug a LEFT JOIN (select distinct Product_Type pihao  from repair.view_info_plan_N_PT)  b
     ON  a.pihao=b.pihao
      

  6.   

    使用 DISTINCT
    DISTINCT 是 SUM、AVG 和 COUNT 的可选关键字。如果使用 DISTINCT,那么在计算总和、平均值或计数之前,先消除重复的值。如果使用 DISTINCT 关键字,表达式必须只包含列名。而不能包含算术表达式。以下查询返回商务书籍的平均价格(不包括重复的值):USE pubs
    SELECT AVG(DISTINCT price)
    FROM titles
    WHERE type = 'business'下面是结果集:------------------
    14.64(1 row(s) affected)如果不使用 DISTINCT 关键字,则 AVG 函数将计算出所有商务书名的平均价格:USE pubs
    SELECT AVG(price)
    FROM titles
    WHERE type = 'business下面是结果集:------------------
    13.73(1 row(s) affected)