求一SQL语句

xiaohe185 2009-06-22 01:15:56
--我有三张表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.....
--如何去限制条件,得到想要的结果
请大侠指教
...全文
30 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tomzzu 2009-06-22
  • 打赏
  • 举报
回复

-- 左连接是满足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'

Small_Four 2009-06-22
  • 打赏
  • 举报
回复
格式还是没弄好,本来想把WHERE的地方用红色表示,结果。。。不好意思
Small_Four 2009-06-22
  • 打赏
  • 举报
回复
那是因为大家没加条件呗,加个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, 2

CREATE 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, 2

CREATE 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_cost

FROM 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
Small_Four 2009-06-22
  • 打赏
  • 举报
回复
那是因为大家没加条件呗,加个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, 2

CREATE 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, 2

CREATE 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_cost

FROM 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
ks_reny 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xiaohe185 的回复:]
--为什么我得不出预期的结果呢,是不是我描述的不够清楚呢
--我有三张表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…
[/Quote]

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%'
xiaohe185 2009-06-22
  • 打赏
  • 举报
回复
--为什么我得不出预期的结果呢,是不是我描述的不够清楚呢
--我有三张表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表
--忘高手赐教
xiaohe185 2009-06-22
  • 打赏
  • 举报
回复
恩,谢谢大虾们,我试试
t240034137 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fredrickhu 的回复:]
引用 3 楼 fredrickhu 的回复:
具体的写法是:
SQL 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 jion B on a.cn_code=b.CN_CODE
left join C c on a.cn_code=c.CN_CODE


抄袭剪刀的 发现剪刀的 join都写成了jion 这不是误导我们吗??
改过来:
SQL codecodeselect 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 jo…
[/Quote]

小F 和我一起干测试工作吧!你人才。
Small_Four 2009-06-22
  • 打赏
  • 举报
回复
谢谢咯!
Small_Four 2009-06-22
  • 打赏
  • 举报
回复
小小测试一下,搂主不要生气哈...


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 format

DROP TABLE format
jinjazz 2009-06-22
  • 打赏
  • 举报
回复
[code等于SQL]xxxx[/code]

把上面的等于换成 = 就可以了
jinjazz 2009-06-22
  • 打赏
  • 举报
回复
...

哈哈
Small_Four 2009-06-22
  • 打赏
  • 举报
回复
不好意思,第2遍想发个有格式的,结果还是这样。。。
Small_Four 2009-06-22
  • 打赏
  • 举报
回复

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_code

DROP TABLE A
DROP TABLE B
DROP TABLE C
Small_Four 2009-06-22
  • 打赏
  • 举报
回复
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_code

DROP TABLE A
DROP TABLE B
DROP TABLE C
ChinaJiaBing 2009-06-22
  • 打赏
  • 举报
回复
--我有三张表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连接...
--小F-- 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
具体的写法是:
SQL 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 jion B on a.cn_code=b.CN_CODE
left join C c on a.cn_code=c.CN_CODE
[/Quote]
抄袭剪刀的 发现剪刀的 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

feixianxxx 2009-06-22
  • 打赏
  • 举报
回复
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
jinlingoo1 2009-06-22
  • 打赏
  • 举报
回复
整清邏輯關係
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
ks_reny 2009-06-22
  • 打赏
  • 举报
回复

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
用左連接.
加载更多回复(3)

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧