--我有三张表A,B,C,三表中都有字段CN_CODE,以A表中的CN_CODE为主键
--现要从三张表中同时取指定CN_CODE的若干字段,其中C表的字段CN_COST要求当表C中存在CN_CODE时,显示对应的CN_CODE,当不存在时,CN_COST置空或置0
--形如
--select a.CN_CODE,a.CN_A1,a.CN_A2,b.CN_B1,b.CN_B2,c.CN_C1,c.CN_COST
--FROM A a, B b, C c
--WHERE.....
--如何去限制条件,得到想要的结果
请大侠指教

解决方案 »

  1.   

    select a.CN_CODE,a.CN_A1,a.CN_A2,b.CN_B1,b.CN_B2,c.CN_C1,isnull(c.CN_COST,0)
    FROM A a left jion B on a.cn_code=b.CN_CODE
    left join C c on a.cn_code=c.CN_CODE
      

  2.   

    用 isnull
    ISNULL
    使用指定的替换值替换 NULL。语法
    ISNULL ( check_expression , replacement_value ) 参数
    check_expression将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。replacement_value在 check_expression 为 NULL时将返回的表达式。replacement_value 必须与 check_expresssion 具有相同的类型。 返回类型
    返回与 check_expression 相同的类型。
      

  3.   

    具体的写法是:select a.CN_CODE,a.CN_A1,a.CN_A2,b.CN_B1,b.CN_B2,c.CN_C1,isnull(c.CN_COST,0)
    FROM A a left jion B on a.cn_code=b.CN_CODE
    left join C c on a.cn_code=c.CN_CODE
      

  4.   


    select a.CN_CODE,a.CN_A1,a.CN_A2,b.CN_B1,b.CN_B2,c.CN_C1,isnull(c.CN_COST,0)
    from A  left join B on A.CN_CODE=B.CN_CODE
            left join C on A.CN_CODE=C.CN_CODE
    用左連接.
      

  5.   

    整清邏輯關係
    select a.CN_CODE,a.CN_A1,a.CN_A2,b.CN_B1,b.CN_B2,c.CN_C1,isnull(c.CN_COST,0)
    FROM A a left jion B on a.cn_code=b.CN_CODE
    left join C c on a.cn_code=c.CN_CODE
      

  6.   

    select a.CN_CODE,a.CN_A1,a.CN_A2,b.CN_B1,b.CN_B2,c.CN_C1,isnull(c.CN_COST,0) as c.CN_COST
    from A  left join B on A.CN_CODE=B.CN_CODE
            left join C on A.CN_CODE=C.CN_CODE
      

  7.   

    抄袭剪刀的 发现剪刀的 join都写成了jion 这不是误导我们吗??
    改过来:codeselect a.CN_CODE,a.CN_A1,a.CN_A2,b.CN_B1,b.CN_B2,c.CN_C1,isnull(c.CN_COST,0)
    FROM A a left join B on a.cn_code=b.CN_CODE
    left join C c on a.cn_code=c.CN_CODE
      

  8.   

    --我有三张表A,B,C,三表中都有字段CN_CODE,以A表中的CN_CODE为主键 
    --现要从三张表中同时取指定CN_CODE的若干字段,其中C表的字段CN_COST要求当表C中存在CN_CODE时,显示对应的CN_CODE,当不存在时,CN_COST置空或置0 
    --形如 
    --select a.CN_CODE,a.CN_A1,a.CN_A2,b.CN_B1,b.CN_B2,c.CN_C1,c.CN_COST 
    --FROM A a, B b, C c 
    --WHERE..... 
    --如何去限制条件,得到想要的结果 
    请大侠指教join连接...
      

  9.   

    CREATE TABLE A
    (
    cn_code varchar(10),
    cn_name varchar(100),
    PRIMARY KEY(cn_code)
    )
    INSERT INTO A
    SELECT '001', 'Lily' UNION ALL
    SELECT '002', 'Jam'CREATE TABLE B
    (
    cn_code varchar(10),
    cn_address varchar(100)
    )
    INSERT INTO B
    SELECT '001', 'China' UNION ALL
    SELECT '002', 'Japan'CREATE TABLE C
    (
    cn_code varchar(10),
    cn_detail varchar(100)
    )
    INSERT INTO C
    SELECT '001', 'It is a Test.'SELECT
    A.cn_code,
    A.cn_name,
    B.cn_address,
    ISNULL(C.cn_detail, '') AS cn_detail
    FROM A
    LEFT JOIN B
    ON A.cn_code = B.cn_code
    LEFT JOIN C
    ON A.cn_code = C.cn_codeDROP TABLE A
    DROP TABLE B
    DROP TABLE C
      

  10.   


    CREATE TABLE A
    (
    cn_code varchar(10),
    cn_name varchar(100),
    PRIMARY KEY(cn_code)
    )
    INSERT INTO A
    SELECT '001', 'Lily' UNION ALL
    SELECT '002', 'Jam'CREATE TABLE B
    (
    cn_code varchar(10),
    cn_address varchar(100)
    )
    INSERT INTO B
    SELECT '001', 'China' UNION ALL
    SELECT '002', 'Japan'CREATE TABLE C
    (
    cn_code varchar(10),
    cn_detail varchar(100)
    )
    INSERT INTO C
    SELECT '001', 'It is a Test.'SELECT
    A.cn_code,
    A.cn_name,
    B.cn_address,
    ISNULL(C.cn_detail, '') AS cn_detail
    FROM A
    LEFT JOIN B
    ON A.cn_code = B.cn_code
    LEFT JOIN C
    ON A.cn_code = C.cn_codeDROP TABLE A
    DROP TABLE B
    DROP TABLE C
      

  11.   

    [code等于SQL]xxxx[/code]把上面的等于换成 = 就可以了
      

  12.   

    小小测试一下,搂主不要生气哈...
    CREATE TABLE format
    (
    formatID smallint,
    formatName nvarchar(100)
    PRIMARY KEY(formatID)
    )
    INSERT INTO format
    SELECT 1, 'Thank You!' UNION ALL
    SELECT 2, 'Very Much'SELECT formatID, formatName FROM formatDROP TABLE format
      

  13.   

    --为什么我得不出预期的结果呢,是不是我描述的不够清楚呢
    --我有三张表A,B,C,三表中都有字段CN_CODE,以A表中的CN_CODE为主键
    --现要从三张表中同时取     指定CN_CODE   的若干字段,其中C表的字段CN_COST要求当表C中存在CN_CODE时,显示对应的CN_CODE,当不存在时,CN_COST置空或置0
    --形如
    --A表字段  CN_CODE, A1, A2,A3, A4, A5
    --B表字段  CN_CODE, B1, B2, B3, B4, B5
    --C表字段  CN_CODE, C1, C2, C3, C4, C5, CN_COST
    --现在我要获取 A.CN_CODE, A.A1, B.B1, B.B2, C.CN_COST
    --条件是:外部获取一CN_CODE, 当A.CN_CODE = 该CN_CODE  AND B.CN_CODE = 该CN_CODE时(一定存在),但该外部输入的CN_CODE 在C表中不一定存在,
    --我要的效果是,当输入的CN_ID在C表中有的时候,直接获取对应的值,当不存在的时候,CN_COST显示为0或NULL
    --以上各位大侠给的,我试了一下,可以,但好像条件未起作用,
    --如果,我这条件是不确定的(模糊查询),如数据库总有CC01-xx,cc01,cc01-yy,当我输入CC01时,又该如何判断,尤其是判断C表
    --忘高手赐教
      

  14.   


    select T.*,c.CN_C1,isnull(c.CN_COST,0)
    from
    (select a.CN_CODE,a.CN_A1,a.CN_A2,b.CN_B1,b.CN_B2,c.CN_C1,isnull(c.CN_COST,0)
      from A ,B 
      where A.CN_CODE=B.CN_CODE) T
            left join C on T.CN_CODE=C.CN_CODE
    ---2 where c.CN_CODE like 'CC01%'
      

  15.   

    那是因为大家没加条件呗,加个WHERE条件就可以了
    CREATE TABLE A
    (
    cn_code varchar(10),
    a1 smallint,
    a2 smallint,
    a3 smallint,
    a4 smallint,
    a5 smallint
    PRIMARY KEY(cn_code)
    )
    INSERT INTO A
    SELECT '001', 1, 1, 1, 1, 1 UNION ALL
    SELECT '002', 2, 2, 2, 2, 2CREATE TABLE B
    (
    cn_code varchar(10),
    b1 smallint,
    b2 smallint,
    b3 smallint,
    b4 smallint,
    b5 smallint
    )
    INSERT INTO B
    SELECT '001', 1, 1, 1, 1, 1 UNION ALL
    SELECT '002', 2, 2, 2, 2, 2CREATE TABLE C
    (
    cn_code varchar(10),
    c1 smallint,
    c2 smallint,
    c3 smallint,
    c4 smallint,
    c5 smallint,
    cn_cost varchar(100) )
    INSERT INTO C
    SELECT '001', 3, 3, 3, 3, 3, 'cn_cost'SELECT
    A.cn_code,
    A.a1,
    B.b1,
    ISNULL(C.cn_cost, '') AS cn_costFROM A
    LEFT JOIN B
    ON A.cn_code = B.cn_code
    LEFT JOIN C
    ON A.cn_code = C.cn_codeWHERE
    A.cn_code = '001'
    DROP TABLE A
    DROP TABLE B
    DROP TABLE C
      

  16.   

    那是因为大家没加条件呗,加个WHERE条件就可以了 
    --Create test Data
    CREATE TABLE A
    (
    cn_code varchar(10),
    a1 smallint,
    a2 smallint,
    a3 smallint,
    a4 smallint,
    a5 smallint
    PRIMARY KEY(cn_code)
    )
    INSERT INTO A
    SELECT '001', 1, 1, 1, 1, 1 UNION ALL
    SELECT '002', 2, 2, 2, 2, 2CREATE TABLE B
    (
    cn_code varchar(10),
    b1 smallint,
    b2 smallint,
    b3 smallint,
    b4 smallint,
    b5 smallint
    )
    INSERT INTO B
    SELECT '001', 1, 1, 1, 1, 1 UNION ALL
    SELECT '002', 2, 2, 2, 2, 2CREATE TABLE C
    (
    cn_code varchar(10),
    c1 smallint,
    c2 smallint,
    c3 smallint,
    c4 smallint,
    c5 smallint,
    cn_cost varchar(100) )
    INSERT INTO C
    SELECT '001', 3, 3, 3, 3, 3, 'cn_cost'SELECT
    A.cn_code,
    A.a1,
    B.b1,
    ISNULL(C.cn_cost, '') AS cn_costFROM A
    LEFT JOIN B
    ON A.cn_code = B.cn_code
    LEFT JOIN C
    ON A.cn_code = C.cn_code
    WHERE
    A.cn_code = '001'
    DROP TABLE A
    DROP TABLE B
    DROP TABLE C
      

  17.   

    格式还是没弄好,本来想把WHERE的地方用红色表示,结果不好意思
      

  18.   


    -- 左连接是满足LZ的要求的
    -- 语句返回A,B中所有符合where后条件的记录, 也就是要查询的CN_CODE
    -- 再左连接C表, 如果C表有要查询的CN_CODE将返回C表实际的字段值, 如果没有将以NULL返回
    -- 所以筛选C表字段时都加上了一个ISNULL的函数, 用户判断如果C表不存在该值将以0,或''值替换NULL
    select a.CN_CODE, a.CN_A1, a.CN_A2, b.CN_B1, b.CN_B2, 
    isnull(c.CN_C1, '') as CN_C1, isnull(c.CN_COST, 0) as CN_COST
    from A as a
    join B as b
    on a.CN_CODE = b.CN_CODE
    left join C as c
    on B.CN_CODE = c.CN_CODE
    where a.CN_CODE = 'LZ传入的CN_CODE'