有3张 表 basicinfor ,guoshui ,dishui
现在要根据 ename 和 trtime 查询 guoshui 里面所有的字段,dishui 里面所有的字段,basicinfor 里面的units1,units2,units3三个字段。
3个表 中都有ename 这个字段。guoshui ,dishui 中的ename 肯定来源basicinfor这个表,
guoshui 和dishui 有trtime 字段。
create table guoshui(
gsid int,
codeid varchar(50),
ename varchar(50),
zzspt float,
transtime varchar(50)
)create table dishui(
dsid int,
codeid varchar(50),
ename varchar(50),
cjr float,
trtime varchar (50)
)create table basicinfor(
eid int,
ename varchar(50),
eaddress varchar(50),
units1 varchar(50),
units2 varchar(50),
units3 varchar(50),
)insert into dishui values(1,'320012','机械厂',3400.99,'2009-02')
insert into dishui values(2,'320013','得力纺织厂',5400.00,'2010-02')
insert into dishui values(3,'320014','实木有限公司',7800.00,'2009-02')
insert into dishui values(4,'320015','维维有限公司',2400.55,'2009-02') insert into guoshui values(1,'520010','机械厂',23444.99,'2009-02')
insert into guoshui values(2,'520012','得力纺织厂',454.00,'2009-02')
insert into guoshui values(3,'520013','壳牌燃油',895.99,'2009-02') insert into basicinfor values(1,'机械厂','南京','古铜县','江宁县','江浦县')
insert into basicinfor values(2,'得力纺织厂','南京','古铜县','','')
insert into basicinfor values(3,'实木有限公司','南京','古铜县','','')
insert into basicinfor values(4,'维维有限公司','南京','古铜县','江宁县','江浦县')
insert into basicinfor values(5,'壳牌燃油','南京','古铜县','','')
当我查询条件是 trtime ='2010-02' 的时候显示的结果是
units1 units2 units3 gsid codeid ename zzspt transtime dsid codeid ename cjr trtime 古铜县 NULL NULL NULL NULL NULL 2 320013 得力纺织厂 5400.00 2010-02
如果我查询条件是 ename='壳牌燃油' 显示的结果是:
units1 units2 units3 gsid codeid ename zzspt transtime dsid codeid ename cjr trtime 古铜县 江宁县 江浦县 3 520013 壳牌燃油 895.99 2009-02 NULL NULL NULL NULL NULL
如果我查到是 ename='机械厂' 和 trtime ='2009-02' (追加 条件 我会用java 自己动态拼接 ,只要写出sql 就行)
units1 units2 units3 gsid codeid ename zzspt transtime dsid codeid ename cjr trtime 古铜县 江宁县 江浦县 1 520010 机械厂 23444.99 2009-02 1 320012 机械厂 3400.99 2009-02guoshui 表里面 ename 有可能不满足条件,那么要让查询记录里面 guoshui这张表的部分显示null,dishui里面的ename如果满足条件 那么就显示值。同样
如果 不满足 trtime 条件的那张表显示null ,瞒足条件的 那张 表显示数据
可能guoshui不满足 也有可能是 dishui这张表不满足 ,如果哪个表不满足条件就用null 填充,满足的显示数据,如果都满足就全部显示,如果都不满足条件 肯定是不显示那条数据了。
就要实现这样的功能3个表 中都有ename 这个字段。
guoshui 和dishui 有trtime 字段。
现在要根据 ename 和 trtime 查询 guoshui 里面所有的字段,dishui 里面所有的字段,basicinfor 里面的units1,units2,units3三个字段。
3个表 中都有ename 这个字段。guoshui ,dishui 中的ename 肯定来源basicinfor这个表,
guoshui 和dishui 有trtime 字段。
create table guoshui(
gsid int,
codeid varchar(50),
ename varchar(50),
zzspt float,
transtime varchar(50)
)create table dishui(
dsid int,
codeid varchar(50),
ename varchar(50),
cjr float,
trtime varchar (50)
)create table basicinfor(
eid int,
ename varchar(50),
eaddress varchar(50),
units1 varchar(50),
units2 varchar(50),
units3 varchar(50),
)insert into dishui values(1,'320012','机械厂',3400.99,'2009-02')
insert into dishui values(2,'320013','得力纺织厂',5400.00,'2010-02')
insert into dishui values(3,'320014','实木有限公司',7800.00,'2009-02')
insert into dishui values(4,'320015','维维有限公司',2400.55,'2009-02') insert into guoshui values(1,'520010','机械厂',23444.99,'2009-02')
insert into guoshui values(2,'520012','得力纺织厂',454.00,'2009-02')
insert into guoshui values(3,'520013','壳牌燃油',895.99,'2009-02') insert into basicinfor values(1,'机械厂','南京','古铜县','江宁县','江浦县')
insert into basicinfor values(2,'得力纺织厂','南京','古铜县','','')
insert into basicinfor values(3,'实木有限公司','南京','古铜县','','')
insert into basicinfor values(4,'维维有限公司','南京','古铜县','江宁县','江浦县')
insert into basicinfor values(5,'壳牌燃油','南京','古铜县','','')
当我查询条件是 trtime ='2010-02' 的时候显示的结果是
units1 units2 units3 gsid codeid ename zzspt transtime dsid codeid ename cjr trtime 古铜县 NULL NULL NULL NULL NULL 2 320013 得力纺织厂 5400.00 2010-02
如果我查询条件是 ename='壳牌燃油' 显示的结果是:
units1 units2 units3 gsid codeid ename zzspt transtime dsid codeid ename cjr trtime 古铜县 江宁县 江浦县 3 520013 壳牌燃油 895.99 2009-02 NULL NULL NULL NULL NULL
如果我查到是 ename='机械厂' 和 trtime ='2009-02' (追加 条件 我会用java 自己动态拼接 ,只要写出sql 就行)
units1 units2 units3 gsid codeid ename zzspt transtime dsid codeid ename cjr trtime 古铜县 江宁县 江浦县 1 520010 机械厂 23444.99 2009-02 1 320012 机械厂 3400.99 2009-02guoshui 表里面 ename 有可能不满足条件,那么要让查询记录里面 guoshui这张表的部分显示null,dishui里面的ename如果满足条件 那么就显示值。同样
如果 不满足 trtime 条件的那张表显示null ,瞒足条件的 那张 表显示数据
可能guoshui不满足 也有可能是 dishui这张表不满足 ,如果哪个表不满足条件就用null 填充,满足的显示数据,如果都满足就全部显示,如果都不满足条件 肯定是不显示那条数据了。
就要实现这样的功能3个表 中都有ename 这个字段。
guoshui 和dishui 有trtime 字段。
解决方案 »
- 求一sql语句,想统计下表内数据的不完整率(计算字段值为空或null的个数)
- 区站号,和日期分组计算
- 如何用SQL编写下列语句
- 高手请进,关于SQL中左连接?
- 弱弱的问一下 Sql server 怎么建一对一的关系
- 插入数据时,如何让表的fid不重复,乃至报错。
- 菜鸟存储过程上手教程,奉献给大家,欢迎转帖!
- 在存储过程中, 用变量代替参数有助于提高执行效率吗?
- 请教:SQL 数据库 崩溃后除了全备及增量备份,如何利用最后的.ldf文件恢复到及时数据库。
- 寻求基于asp+sql server的bbs源代码,麻烦给位了!急~~~~~~~~~~~~~~~~
- 求助数据恢复语句
- 在线等一条 多表查询 sql语句,急~ 。解决立马结贴
on a.ename=b.ename full outer join dishui c
on a.ename=c.ename
-----------------------------------------
select isnull(t1.units1,t2.units1) units1,isnull(t1.units2,t2.units2) units2,isnull(t1.units3,t2.units3) units3,
t1.gsid,t1.codeid,t1.ename,t1.zzspt,t1.transtime,t2.dsid,t2.codeid,t2.ename,t2.cjr,t2.trtime
from
(
select a.units1,a.units2,a.units3,b.gsid,b.codeid,b.ename,b.zzspt,b.transtime
from basicinfor a join guoshui b on a.ename=b.ename
) t1
full join
(
select a.units1,a.units2,a.units3,c.dsid,c.codeid,c.ename,c.cjr,c.trtime
from basicinfor a join dishui c on a.ename=c.ename
) t2
on t1.ename = t2.ename and t1.transtime = t2.trtime
where (t2.trtime='2010-02') or
isnull(t1.ename,t2.ename)='壳牌燃油' or
(isnull(t1.ename,t2.ename)='机械厂' and t2.trtime ='2009-02' )
------------------------------------------------
select * from basicinfor a full join
(
select b.gsid,b.codeid as b_codeid,b.ename as b_ename,b.zzspt,b.transtime,c.* from guoshui b full join dishui c on b.ename = c.ename and b.transtime = c.trtime
)t on a.ename = isnull(t.ename ,t.b_ename)
where trtime = '2010-02'--2)a.ename='壳牌燃油'
select * from basicinfor a full join
(
select b.gsid,b.codeid as b_codeid,b.ename as b_ename,b.zzspt,b.transtime,c.* from guoshui b full join dishui c on b.ename = c.ename and b.transtime = c.trtime
)t on a.ename = isnull(t.ename ,t.b_ename)
where a.ename='壳牌燃油'
--3)ename='机械厂' 和 trtime ='2009-02'
select * from basicinfor a full join
(
select b.gsid,b.codeid as b_codeid,b.ename as b_ename,b.zzspt,b.transtime,c.* from guoshui b full join dishui c on b.ename = c.ename and b.transtime = c.trtime
)t on a.ename = isnull(t.ename ,t.b_ename)
where a.ename='机械厂' and trtime ='2009-02'
结果就不粘了,跟楼主的需要一样
create table guoshui(
gsid int,
codeid varchar(50),
ename varchar(50),
zzspt float,
transtime varchar(50)
)create table dishui(
dsid int,
codeid varchar(50),
ename varchar(50),
cjr float,
trtime varchar (50)
)create table basicinfor(
eid int,
ename varchar(50),
eaddress varchar(50),
units1 varchar(50),
units2 varchar(50),
units3 varchar(50),
)insert into dishui values(1,'320012','机械厂',3400.99,'2009-02')
insert into dishui values(2,'320013','得力纺织厂',5400.00,'2010-02')
insert into dishui values(3,'320014','实木有限公司',7800.00,'2009-02')
insert into dishui values(4,'320015','维维有限公司',2400.55,'2009-02') insert into guoshui values(1,'520010','机械厂',23444.99,'2009-02')
insert into guoshui values(2,'520012','得力纺织厂',454.00,'2009-02')
insert into guoshui values(3,'520013','壳牌燃油',895.99,'2009-02') insert into basicinfor values(1,'机械厂','南京','古铜县','江宁县','江浦县')
insert into basicinfor values(2,'得力纺织厂','南京','古铜县','','')
insert into basicinfor values(3,'实木有限公司','南京','古铜县','','')
insert into basicinfor values(4,'维维有限公司','南京','古铜县','江宁县','江浦县')
insert into basicinfor values(5,'壳牌燃油','南京','古铜县','','')
---------
select * from dishui a full join guoshui b on a.cjr=b.codeid
full join basicinfor c on a.cjr=c.eid
where a.trtime='2010-02'
drop table dishui
drop table guoshui
drop table basicinfor
时间条件 不是一定是 dishui 里面的 trtime ='2010-02' 也有可能 是guoshui 里面的transtime 满足第一句和最后一句
select * from basicinfor a full join
(
select b.gsid,b.codeid as b_codeid,b.ename as b_ename,b.zzspt,b.transtime,c.* from guoshui b full join dishui c on b.ename = c.ename and b.transtime = c.trtime
)t on a.ename = isnull(t.ename ,t.b_ename)
where a.ename='机械厂' and trtime ='2009-02' 应该改成
// 表中 trtime 和实际表中 transtime 不一样为 删了从建
drop table dishui;create table dishui(
dsid int,
codeid varchar(50),
ename varchar(50),
cjr float,
transtime varchar (50)
)//一下 是我实际测试的sql 代码
select * from basicinfor a full join
(
select b.gsid,b.codeid as b_codeid,b.ename as b_ename,b.zzspt,b.transtime as b_transtime,c.* from guoshui b full join dishui c on b.ename = c.ename and b.transtime = c.transtime
)t on a.ename = isnull(t.ename ,t.b_ename)
where (transtime = '2009-03' and a.ename='机械厂') or (b_transtime ='2009-03' and a.ename='机械厂')
其实昨天自己也写了个 sql 比7楼的 更方便取得需要的字段
select b.units,b.units2,b.units3,g.*,d.*
from basicinfor as b
left join guoshui as g on b.ename=g.ename and g.ename='机械厂' and g.transtime='2009-02'
left join dishui as d on b.ename=d.ename and d.ename='机械厂' and d.transtime='2009-02'
where (d.ename='机械厂' and d.transtime='2009-02') or (g.ename='机械厂' and g.transtime='2009-02')开始 我是写到
select b.units,b.units2,b.units3,g.*,d.*
from basicinfor as b
left join guoshui as g on b.ename=g.ename
left join dishui as d on b.ename=d.ename
where (d.ename='机械厂' and d.transtime='2009-02') or (g.ename='机械厂' and g.transtime='2009-02')
查出来的总是不对 所以才发贴过来询问。
那知道 总是有人告诉我 左联,联合,或者就写个 不加条件的联合查询 ,那有什么用呢?