none
三张表关联查询(三张表都有字段需要显示) RRS feed

  • 问题

  • 表A查询account字段。表B查询custname字段,表A和B通过account字段关联。表C查询custnamecn字段,表B和C通过custname字段关联。

    我用select A.account,B.custname,C.custnamecn from A INNER JOIN B ON A.account = B.account INNER JOIN C ON B.custname = C.custname 查出来的结果不对,多了很多重复的记录。请问应该怎样写才对

    2013年7月17日 5:10

全部回复

  • Hi,

    您重覆發帖了哦!

    http://social.msdn.microsoft.com/Forums/zh-TW/64ef219f-47b2-4aad-a9ae-e303d453b586

    USE tempdb
    GO

    CREATE TABLE A
    (
    account INT
    ) ;

    CREATE TABLE B
    (
    account INT
    , custname VARCHAR(10)
    ) ;
     
    CREATE TABLE C
    (
    cid INT
    , custname VARCHAR(10)
    , custnamecn VARCHAR(20)
    );
     
    INSERT INTO A VALUES(1), (2), (3);
    INSERT INTO B VALUES(1, 'cname1'), (2, 'cname2'), (3, 'cname3');
    INSERT INTO C VALUES(1, 'cname1', 'custnamecn1'), (2, 'cname2', 'custnamecn2'), (3, 'cname3', 'custnamecn3');

    SELECT * from dbo.A
    SELECT * from dbo.B
    SELECT * from dbo.C

    SELECT A.account, B.custname, C.custnamecn
    from A INNER JOIN B ON A.account = B.account
    INNER JOIN C ON B.custname = C.custname

    如果您有些Key無法過濾,可試著加入distinct!

    SELECT DISTINCT A.account, B.custname, C.custnamecn
    from A INNER JOIN B ON A.account = B.account
    INNER JOIN C ON B.custname = C.custname


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年7月17日 5:24
  • 应该是数据多对多引起的,可以用DISTINCT过滤重复数据。


    Please Mark As Answer if it is helpful.

    2013年7月17日 5:33
  • 不好意思,我补充说明一下。A表还有一个amount的字段,我需要用group by对这个字段做sum计算还要对account做count计算。如果用distinct算出来的sum(amount)和count(account)是不正确的。
    2013年7月17日 9:31
  • Hi,

    如果您依 A.account, B.custname, C.custnamecn Group的話,那應該也會變成不重覆的資料哦!

    還是您可以建立一個簡單的測試Script,Po出來給大伙參考看看哦! Thanks.


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年7月17日 9:41
  • 我的查询语句如下。SELECT A.account,SUM(A.amount) AS totalamount,COUNT(A.account) AS count,B.custname,C.custnamecn FROM  A INNER JOIN B ON A.account = B.account INNER JOIN C ON B.custname = C.custname GROUP BY A.account,B.custname,C.custnamecn

    查出来的结果count字段都上万条了,但是A表里一共才195条记录。

    2013年7月17日 9:49
  • Hi,

    應該是因為B的資料中,有很多相同的account吧!

    請將COUNT(A.account) 改成 COUNT( DISTINCT A.account) ,如下,

    SELECT  A.account ,
            SUM(A.amount) AS totalamount ,
            COUNT( DISTINCT A.account) AS count ,
            B.custname ,
            C.custnamecn
    FROM    A
            INNER JOIN B ON A.account = B.account
            INNER JOIN C ON B.custname = C.custname
    GROUP BY A.account ,
            B.custname ,
            C.custnamecn


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年7月17日 10:48
  • 这样写的结果count列全部显示1,而且SUM(A.mount)这一列的计算结果也不对。
    2013年7月18日 2:09
  • 后来我尝试了另一种写法,SELECT account,SUM(amount) as totalamount,COUNT(account) as count,C.custnamecn FROM (select DISTINCT A.account,A.amount,B.custname,C.custnamecn from A INNER JOIN B ON A.account = B.account INNER JOIN C ON B.custname = C.custname ) as t GROUP BY account,custnamecn 这个写法有个问题,就是如果account和amount完全一样的两条数据会合并为一条,这样计算出来的总数就少了一条记录。
    2013年7月18日 2:18
  • Hi,

    您可以將資料表及測試資料呈現出來及您期望的資料呈現出來,這樣大伙比較好理解哦!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年7月18日 7:31