根据不同情况联结不同的表

sz_free_bird 2009-03-18 07:04:01
select * from table1 
case table1.column
when 1 then inner join table2 on...
when 2 then inner join table2 on...
end

上面是伪代码。
意思就是根据table1表中某列的的值来联结不同的表。
如果采用伪代码的实现方式,语法通不过。
有别的实现方式么?
忘指教
...全文
216 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sz_free_bird 2009-03-18
  • 打赏
  • 举报
回复
给的参考太牛了,都看不太明白。
ljluck7687 2009-03-18
  • 打赏
  • 举报
回复
有意思,顶
fcuandy 2009-03-18
  • 打赏
  • 举报
回复
一模一要的问题。

参考
http://topic.csdn.net/u/20081111/07/a6346cdc-0d9f-4f5a-bcb1-00cba3791c9c.html

http://topic.csdn.net/u/20081115/00/17588ccc-68be-4cac-8036-1bc3f78c7b3f.html

一个是xml方式一条语句实现(性能较差),一个是动态语句实现。
sz_free_bird 2009-03-18
  • 打赏
  • 举报
回复
强烈建议论坛用一个UBB。编辑格式的时候特别麻烦。
sz_free_bird 2009-03-18
  • 打赏
  • 举报
回复
不好意思,没表达清楚p.style的值为1时连接price1,为2时连接price2
htl258_Tony 2009-03-18
  • 打赏
  • 举报
回复
--如果为1就连接Price1.如果为2就连接price2这个是如果什么为1呢
你可以先作判断,用字符串连接的办法查询。
declare @s varchar(8000)
if exists(select 1 from table1 where a=1)
set @s='SELECT DISTINCT p.ID,p.PriceName,p.Transit,p.MoneyType,p.Style--此列用于连接条件
FROM sloa.dbo.Price AS p--如果为1就连接Price1.如果为2就连接price2
INNER JOIN sloa.dbo.Price1 AS p1
ON p1.PriceID=p.ID
INNER JOIN sloa.dbo.[Exp] AS e
ON e.PriceID=p.ID AND p1.MeterageID=e.MeterageID '
else if exists(select 1 from table1 where a=2)
set @s='SELECT DISTINCT p.ID,p.PriceName,p.Transit,p.MoneyType,p.Style--此列用于连接条件
FROM sloa.dbo.Price AS p--如果为1就连接Price1.如果为2就连接price2
INNER JOIN sloa.dbo.Price2 AS p1
ON p1.PriceID=p.ID
INNER JOIN sloa.dbo.[Exp] AS e
ON e.PriceID=p.ID AND p1.MeterageID=e.MeterageID '
set @s=@s+' WHERE p.[type]=0--只查询内部报价和不限内外的报价
AND (p.DateStart<=GETDATE() AND p.DateEnd>=GETDATE())--在有效期内
AND p.validity=1--有效的报价表
AND p.Transit LIKE ''%ups%''--指定运输方式的报价表
AND p.companyuse LIKE ''%szsl%''--只限查询公司使用的报价表
AND p.priority>0--报价表优先级大于0
--测试在输入的国家是否在报价表服务之列,以排除此报价不走的国家的报价表
AND ((EXISTS(SELECT * FROM sloa.dbo.Price1 --国家名存在
WHERE CountryNo=''us''
AND PriceID=p.ID))
OR(EXISTS(SELECT * FROM sloa.dbo.Region1--或者分区中存在
WHERE RegionID=p.RegionID
AND CountryNo=''us'')))
AND 20>p1.WTStart
AND 20<=p1.WTEnd
AND p1.PackDoc=''wpx''
AND p1.CountryNo=''us'''
exec(@s)
sz_free_bird 2009-03-18
  • 打赏
  • 举报
回复
table2和table3的结构根本就不一样。如果一样,数据就放在一个表了,免去按条件连接两张表的苦恼
jinjazz 2009-03-18
  • 打赏
  • 举报
回复
你把table1和table2 union起来在join不行么?
sz_free_bird 2009-03-18
  • 打赏
  • 举报
回复
SELECT DISTINCT p.ID,p.PriceName,p.Transit,p.MoneyType,p.Style--此列用于连接条件
FROM sloa.dbo.Price AS p--如果为1就连接Price1.如果为2就连接price2
INNER JOIN sloa.dbo.Price1 AS p1
ON p1.PriceID=p.ID
INNER JOIN sloa.dbo.[Exp] AS e
ON e.PriceID=p.ID AND p1.MeterageID=e.MeterageID
WHERE p.[type]=0--只查询内部报价和不限内外的报价
AND (p.DateStart<=GETDATE() AND p.DateEnd>=GETDATE())--在有效期内
AND p.validity=1--有效的报价表
AND p.Transit LIKE '%ups%'--指定运输方式的报价表
AND p.companyuse LIKE '%szsl%'--只限查询公司使用的报价表
AND p.priority>0--报价表优先级大于0
测试在输入的国家是否在报价表服务之列,以排除此报价不走的国家的报价表
AND ((EXISTS(SELECT * FROM sloa.dbo.Price1 --国家名存在
WHERE CountryNo='us'
AND PriceID=p.ID))
OR(EXISTS(SELECT * FROM sloa.dbo.Region1--或者分区中存在
WHERE RegionID=p.RegionID
AND CountryNo='us')))
AND 20>p1.WTStart
AND 20<=p1.WTEnd
AND p1.PackDoc='wpx'
AND p1.CountryNo='us'

贴全部代码吧,太长了。怕大家看到就跑了。
  • 打赏
  • 举报
回复
使用动态语句可否?

declare @s varchar(max),@type int
set @type=1
set @s='select * from tb '+case when @type=1 then 'join tb1 on tb.id=tb1.id' when @type=2 then 'join tb2 on tb.id=tb2.id'end

print @s
结果:
select * from tb join tb1 on tb.id=tb1.id

declare @s varchar(max),@type int
set @type=2
set @s='select * from tb '+case when @type=1 then 'join tb1 on tb.id=tb1.id' when @type=2 then 'join tb2 on tb.id=tb2.id'end

print @s

结果:
select * from tb join tb2 on tb.id=tb2.id
百年树人 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sz_free_bird 的回复:]
还是有个问题,如果采用

SQL codeIF (SELECT [column] FROM TABLE1)=1



的方式的话。
这是我table1中的数据
2241 香港UPS UPS RMB 2
2596 香港UPS全区特惠价 UPS RMB 2
2282 香港UPS部分国家特惠价 UPS RMB 2
2131 日本专线特惠价 SL专线 RMB 1
2569 越南专线 SL专线 RMB 1
这样的结果就不止一个。
[/Quote]
这样的话,case when也没法搞
只能列举了

if exists(select 1 from table1 where [column]=1 and [column]=2)
select * from table1 left join a,left join b on ....
else
if exists(select 1 from table1 where [column]=1)
select * from table1 join a
if exists(select 1 from table1 where [column]=2)
select * from table1 join b
......
sdhdy 2009-03-18
  • 打赏
  • 举报
回复

?这样
IF (SELECT [column] FROM TABLE1 where id=2241)
select ....
if (SELECT [column] FROM TABLE1 where id=2596)
select ....
水族杰纶 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sz_free_bird 的回复:]
还是有个问题,如果采用

SQL codeIF (SELECT [column] FROM TABLE1)=1



的方式的话。
这是我table1中的数据
2241 香港UPS UPS RMB 2
2596 香港UPS全区特惠价 UPS RMB 2
2282 香港UPS部分国家特惠价 UPS RMB 2
2131 日本专线特惠价 SL专线 RMB 1
2569 越南专线 SL专线 RMB 1
这样的结果就不止一个。
[/Quote]
--这样?
IF EXISTS(SELECT 1 FROM TABLE1 WHERE 字段=1)
SELECT * FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.ID=TABLE2.ID
ELSE IF EXISTS(SELECT 1 FROM TABLE1 WHERE 字段=2)
SELECT * FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.ID=TABLE2.ID

htl258_Tony 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sz_free_bird 的回复:]
还是有个问题,如果采用

SQL codeIF (SELECT [column] FROM TABLE1)=1



的方式的话。
这是我table1中的数据
2241 香港UPS UPS RMB 2
2596 香港UPS全区特惠价 UPS RMB 2
2282 香港UPS部分国家特惠价 UPS RMB 2
2131 日本专线特惠价 SL专线 RMB 1
2569 越南专线 SL专线 RMB 1
这样的结果就不止一个。
[/Quote]那就做动态SQL
sz_free_bird 2009-03-18
  • 打赏
  • 举报
回复
还是有个问题,如果采用
IF (SELECT [column] FROM TABLE1)=1

的方式的话。
这是我table1中的数据
2241 香港UPS UPS RMB 2
2596 香港UPS全区特惠价 UPS RMB 2
2282 香港UPS部分国家特惠价 UPS RMB 2
2131 日本专线特惠价 SL专线 RMB 1
2569 越南专线 SL专线 RMB 1
这样的结果就不止一个。
sz_free_bird 2009-03-18
  • 打赏
  • 举报
回复
2楼明白我的意思了。

select * from table1
case table1.column
when 1 then inner join table2 on...
when 2 then inner join table3 on...
end

我试试先。


ks_reny 2009-03-18
  • 打赏
  • 举报
回复

用动态语句拼接吧。
declare @sql varchar(500)
select @sql='select * from table1'
if exists(select 1 from table1 where a=1)
begin
select @sql=@sql+' inner join' table2 on....'
end
if exists(select 1 from table1 where a=2)
begin
select @sql=@sql+' inner join' table2 on....'
end
exec(@sql)
水族杰纶 2009-03-18
  • 打赏
  • 举报
回复
IF (SELECT [column] FROM TABLE1)=1
SELECT * FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.ID=TABLE2.ID
ELSE IF(SELECT [column] FROM TABLE1)=2
SELECT * FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.ID=TABLE2.ID
htl258_Tony 2009-03-18
  • 打赏
  • 举报
回复
明显语法不对,你想要的结果是什么?
select * from tb1 inner join tb2 on ... inner join tb3 on ...

22,181

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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