复杂查询语句组合求助!!

rocsoar 2004-03-15 03:31:42
条件:
表A的字段有ID,A,B,C
表B的字段有PID,D
表A.ID=表B.PID,表B的字段D是更改表A的字段A得到的。
目的:
如果有B.PID=A.ID,则组合成这样的语句:select A.ID,B.D,A.B,A.C from A,B where A.ID=B.PID
否则,则组合成这样的语句:select ID,A,B,C from A

请问:能够用一条语句完成吗?比如说select b,c,(if......else......)
谢谢各位。
...全文
30 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
rocsoar 2004-03-16
  • 打赏
  • 举报
回复
thanks you all guys!
谢谢谢谢。
zjcxc 元老 2004-03-15
  • 打赏
  • 举报
回复
那样是没错,但小比都不建议你那样做,下个版本可能就不支持了.

而且我确实碰到过用*=得出的数据不对的情况.
realgz 2004-03-15
  • 打赏
  • 举报
回复
我 倒同意在不会发生岐义理解的情况下使用*=,节约键盘,代码好看:)
peterzhong 2004-03-15
  • 打赏
  • 举报
回复
再试一次,上次方式对头,不过条件限制简单一些,有些问题
SELECT A.ID,B.D,A.B,A.C FROM A,B WHERE A.ID=B.PID AND (SELECT COUNT(*) FROM A,B WHERE A.ID=B.PID)>0
UNION
SELECT A.ID,A.A,A.B,A.C FROM A,B WHERE (SELECT COUNT(*) FROM A,B WHERE A.ID=B.PID)=0


smalldeer 2004-03-15
  • 打赏
  • 举报
回复
建议不要用*=来实现
---------------

教育的是,有时候很懒left outer join 懒的敲,打个星号快啊,

以后一定注意,格式还是要讲的
peterzhong 2004-03-15
  • 打赏
  • 举报
回复
呵呵,我的回答错了
peterzhong 2004-03-15
  • 打赏
  • 举报
回复
应该用UNION就可以实现,我在SQL SERVER 2000 下调试通过

SELECT A.ID,B.D,A.B,A.C FROM A,B WHERE A.ID=B.PID
UNION
SELECT A.ID,A,A.B,A.C FROM A,B WHERE A.ID<>B.PID
zjcxc 元老 2004-03-15
  • 打赏
  • 举报
回复
建议不要用*=来实现


在早期的 Microsoft® SQL Server™ 2000 版本中,使用 *= 和 =* 在 WHERE 子句中指定左、右外部联接条件。
有时,该语法会导致有多种解释的不明确查询。
****************************************************************

FROM 子句中指定遵从 SQL-92 的外部联接,不会导致上述不确定性。因为 SQL-92 语法更为精确,所以,本版中未包括有关在 WHERE 子句中使用旧的 Transact-SQL 外部联接语法的详细信息。以后的 SQL Server 版本可能不再支持该语法。任何使用 Transact-SQL 外部联接的语句都应改为使用 SQL-92 语法。

SQL-92 标准支持 FROM 或 WHERE 子句中的内部联接规范。WHERE 子句中指定的内部联接不会出现与 Transact-SQL 外部联接语法相同的不确定性问题。

zjcxc 元老 2004-03-15
  • 打赏
  • 举报
回复
--测试

--测试数据
create table A(id int,A varchar(10),B varchar(10),C varchar(10))
insert A select 1,'aa1','bb1','cc1'
union all select 2,'aa2','bb2','cc2'
union all select 3,'aa3','bb3','cc3'
union all select 4,'aa4','bb4','cc4'

create table B(pid int,D varchar(10))
insert B select 1,'zz1'
union all select 2,'zz2'
go

--查询
select a.id,d=isnull(b.d,a.a)
,a.b,a.c
from A
left join B on A.ID=B.PID
go

--删除测试环境
drop table a,b

/*--测试结果
id d b c
----------- ---------- ---------- ----------
1 zz1 bb1 cc1
2 zz2 bb2 cc2
3 aa3 bb3 cc3
4 aa4 bb4 cc4

(所影响的行数为 4 行)
--*/
zjcxc 元老 2004-03-15
  • 打赏
  • 举报
回复
--写错了一点,改一下:

--查询
select a.id,d=isnull(b.d,a.a)
,a.b,a.c
from A
left join B on A.ID=B.PID
zjcxc 元老 2004-03-15
  • 打赏
  • 举报
回复
select a.id,b.d,d=isnull(b.d,a.a)
,a.b,a.c
from A
left join B on A.ID=B.PID
smalldeer 2004-03-15
  • 打赏
  • 举报
回复
sql应该这样


select 表A.ID,isnull(表B.D,表A.A) as A ,表A.B,表A.C from 表A,表B where 表A.ID*=表B.PID

realgz 2004-03-15
  • 打赏
  • 举报
回复
select A.ID,case when is b.d is null then A else b.d end ,A.B,A.C
from A,B
where A.ID*=B.PID
smalldeer 2004-03-15
  • 打赏
  • 举报
回复
create table 表A(
id int,
A varchar(10),
B varchar(10),
C varchar(10)
)
go

create table 表B(
pid int,
D varchar(10)
)
go

insert into 表A values(1,'aa1','bb1','cc1')
insert into 表A values(2,'aa2','bb2','cc2')
insert into 表A values(3,'aa3','bb3','cc3')
insert into 表A values(4,'aa4','bb4','cc4')

insert into 表B values(1,'zz1')
insert into 表B values(2,'zz2')

select * from 表A
select * from 表B

select a.ID,isnull(表B.D,(select 表A.A from 表A where id=a.id)) as A ,a.B,a.C from 表A a,表B where a.ID*=表B.PID


------------------------
1 zz1 bb1 cc1
2 zz2 bb2 cc2
3 aa3 bb3 cc3
4 aa4 bb4 cc4
------------------------

应该有更好的方法,在看看,也等待各位的高见
realgz 2004-03-15
  • 打赏
  • 举报
回复
select A.ID,case when is null then A else b.d end ,,A.B,A.C
from A,B
where A.ID*=B.PID
leeboyan 2004-03-15
  • 打赏
  • 举报
回复
错了
leeboyan 2004-03-15
  • 打赏
  • 举报
回复
select A.ID,B.D,A.B,A.C from A left join B on A.ID=B.PID
union all
select A.* from A left join B on A.ID<>B.PID

rocsoar 2004-03-15
  • 打赏
  • 举报
回复
BTW,不使用存储过程,只使用一条返回结果集的查询语句。

34,587

社区成员

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

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