删选连表问题,连表问题

我是三峡移民 2017-03-04 03:47:12
现在有A,B,C,D3个表,同时有一个E表
A为主表,可以连到B,C,D,问题来了,要想连到E表是没法直接连的,
如果A表中可以连接到B表字段存在的情况下
A---->B--->E
如果不存在
A---->C--->E
如果A表中可以连接到b,c表字段都不存在下,
那么使用
A----->D--->E
问题是这个怎么写
我只会这种

select *
from A left join B on A.字段=B.字段 left join E ON E.字段=B.字段
...全文
544 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称被占用了 2017-03-16
  • 打赏
  • 举报
回复
就是19#的那个意思,字段根据自己选择,必要时可以使用isnull函数
昵称被占用了 2017-03-16
  • 打赏
  • 举报
回复
没这么复杂吧 直接
select  A.*
       ,b.字段
    ,c.字段
    ,d.字段
    ,e.字段
from A left join  B on A.字段=B.字段 
  left join  C on A.字段=C.字段 
  left join  D on A.字段=D.字段 
  left join E ON E.字段=B.字段 or E.字段=C.字段 or E.字段=D.字段
Ginnnnnnnn 2017-03-14
  • 打赏
  • 举报
回复
难道你要的不是这样的效果?
;WITH C1 AS(
SELECT 1 AS ID
UNION ALL SELECT 2 AS ID
UNION ALL SELECT 3 AS ID
UNION ALL SELECT 4 AS ID
),C2 AS (
SELECT 2 AS BID, 3 AS EID
),C3 AS (
SELECT 3 AS CID, 2 AS EID
),C4 AS (
SELECT 4 AS DID, 1 AS EID
),C5 AS (
SELECT 1 AS ID,'V' AS Value
UNION ALL SELECT 2 AS ID,'B'
UNION ALL SELECT 3 AS ID,'M'
UNION ALL SELECT 4 AS ID,'I'
)
SELECT c1.ID,C5.Value
	FROM C1 
	LEFT JOIN C2 ON C1.ID = C2.BID
	LEFT JOIN C3 ON C1.ID = C3.CID
	LEFT JOIN C4 ON C1.ID = C4.DID
	LEFT JOIN C5 ON C5.ID IN (C2.EID,C3.EID,C4.EID)
	WHERE C5.Value > ''
ID Value ----------- ----- 2 M 3 B 4 V
我是三峡移民 2017-03-07
  • 打赏
  • 举报
回复
引用 17 楼 KanzakiOrange 的回复:
你这样…,意思看懂即可 A left join B on a.ID = B.ID left join C on a.ID = C.ID left join D on a.ID = D.ID left join E on E.ID in( B.ID,C.ID,D.ID) 这样可以试试有没有效率问题
你这样写不行哦
Ginnnnnnnn 2017-03-06
  • 打赏
  • 举报
回复
你这样…,意思看懂即可 A left join B on a.ID = B.ID left join C on a.ID = C.ID left join D on a.ID = D.ID left join E on E.ID in( B.ID,C.ID,D.ID) 这样可以试试有没有效率问题
二月十六 2017-03-04
  • 打赏
  • 举报
回复
引用 15 楼 qq_34082025 的回复:
[quote=引用 14 楼 sinat_28984567 的回复:] [quote=引用 12 楼 qq_34082025 的回复:] 你这样做,确实可以,但我没法用,还是感谢,可能我这边要改数据库了,我这边只能使用最基本的select * from where order by
为啥没法用?基本的语句就可以实现这个啊。
;WITH tempa AS (
SELECT * FROM a inner join b inner join e
),tempb AS (
SELECT ...
),tempd AS (
SELECT ...
)
SELECT * FROM tempa UNION SELECT * FROM tempb...
就这么个语句,你能写select,就行 [/quote] 调一个分页方法,列就是select后面写select 的列,from就写后面就写连接表 比如select b.id form A b 就写成 mod.columns:b.id; mod.tableName:A b; 固定死的格式,UNION all这个放到tableName里面去根本不认识,直接报错[/quote] 那你这个问题就不是sql的事了,因为sql实现这个非常简单。 应该是你的这个固定格式的问题,应该去问问规定这种固定格式的人怎么解决这类问题。
我是三峡移民 2017-03-04
  • 打赏
  • 举报
回复
引用 14 楼 sinat_28984567 的回复:
[quote=引用 12 楼 qq_34082025 的回复:] 你这样做,确实可以,但我没法用,还是感谢,可能我这边要改数据库了,我这边只能使用最基本的select * from where order by
为啥没法用?基本的语句就可以实现这个啊。
;WITH tempa AS (
SELECT * FROM a inner join b inner join e
),tempb AS (
SELECT ...
),tempd AS (
SELECT ...
)
SELECT * FROM tempa UNION SELECT * FROM tempb...
就这么个语句,你能写select,就行 [/quote] 调一个分页方法,列就是select后面写select 的列,from就写后面就写连接表 比如select b.id form A b 就写成 mod.columns:b.id; mod.tableName:A b; 固定死的格式,UNION all这个放到tableName里面去根本不认识,直接报错
二月十六 2017-03-04
  • 打赏
  • 举报
回复
引用 12 楼 qq_34082025 的回复:
你这样做,确实可以,但我没法用,还是感谢,可能我这边要改数据库了,我这边只能使用最基本的select * from where order by
为啥没法用?基本的语句就可以实现这个啊。
;WITH tempa AS (
SELECT * FROM a inner join b inner join e
),tempb AS (
SELECT ...
),tempd AS (
SELECT ...
)
SELECT * FROM tempa UNION SELECT * FROM tempb...
就这么个语句,你能写select,就行
我是三峡移民 2017-03-04
  • 打赏
  • 举报
回复
引用 12 楼 qq_34082025 的回复:
[quote=引用 11 楼 sinat_28984567 的回复:] [quote=引用 10 楼 qq_34082025 的回复:] [quote=引用 7 楼 sinat_28984567 的回复:] [quote=引用 6 楼 qq_34082025 的回复:] [quote=引用 5 楼 sinat_28984567 的回复:] [quote=引用 3 楼 qq_34082025 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
很明显不是这个啊,这个我自己都会写,我要判断那种的,你这样写有重复性,DISTINCT,也是不可靠的[/quote] 你最后要哪个表的数据?还是三个连接表所有的数据?B、C、D三个表结构一样吗? 最好给出测试数据和想要的结果。对大家理解你的问题也有帮助。[/quote]最后是个综合数据,测试数据没必须吧,其实就是个if ,else的,按算法来看就是一个小问题,就是sql怎么写,我是一点思路都没有,if exists( is null),我试过,没法用[/quote] 恩你这个问题应该是个非常简单的问题。[/quote]感觉有法写没,没法我就不做了[/quote] 肯定有啊,这么个简答问题。 先用a inner join b inner join e 得到一组数据。 然后在 a inner join c inner join e where a,id not in 上边那组数据a.id 然后在 a inner join d inner join e where a,id not in 上边那两组数据a.id 三组数据union到一起就对了 [/quote]你这样做,确实可以,但我没法用,还是感谢,可能我这边要改数据库了,我这边只能使用最基本的select * from where order by [/quote]这种格式
我是三峡移民 2017-03-04
  • 打赏
  • 举报
回复
引用 11 楼 sinat_28984567 的回复:
[quote=引用 10 楼 qq_34082025 的回复:] [quote=引用 7 楼 sinat_28984567 的回复:] [quote=引用 6 楼 qq_34082025 的回复:] [quote=引用 5 楼 sinat_28984567 的回复:] [quote=引用 3 楼 qq_34082025 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
很明显不是这个啊,这个我自己都会写,我要判断那种的,你这样写有重复性,DISTINCT,也是不可靠的[/quote] 你最后要哪个表的数据?还是三个连接表所有的数据?B、C、D三个表结构一样吗? 最好给出测试数据和想要的结果。对大家理解你的问题也有帮助。[/quote]最后是个综合数据,测试数据没必须吧,其实就是个if ,else的,按算法来看就是一个小问题,就是sql怎么写,我是一点思路都没有,if exists( is null),我试过,没法用[/quote] 恩你这个问题应该是个非常简单的问题。[/quote]感觉有法写没,没法我就不做了[/quote] 肯定有啊,这么个简答问题。 先用a inner join b inner join e 得到一组数据。 然后在 a inner join c inner join e where a,id not in 上边那组数据a.id 然后在 a inner join d inner join e where a,id not in 上边那两组数据a.id 三组数据union到一起就对了 [/quote]你这样做,确实可以,但我没法用,还是感谢,可能我这边要改数据库了,我这边只能使用最基本的select * from where order by
二月十六 2017-03-04
  • 打赏
  • 举报
回复
引用 10 楼 qq_34082025 的回复:
[quote=引用 7 楼 sinat_28984567 的回复:] [quote=引用 6 楼 qq_34082025 的回复:] [quote=引用 5 楼 sinat_28984567 的回复:] [quote=引用 3 楼 qq_34082025 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
很明显不是这个啊,这个我自己都会写,我要判断那种的,你这样写有重复性,DISTINCT,也是不可靠的[/quote] 你最后要哪个表的数据?还是三个连接表所有的数据?B、C、D三个表结构一样吗? 最好给出测试数据和想要的结果。对大家理解你的问题也有帮助。[/quote]最后是个综合数据,测试数据没必须吧,其实就是个if ,else的,按算法来看就是一个小问题,就是sql怎么写,我是一点思路都没有,if exists( is null),我试过,没法用[/quote] 恩你这个问题应该是个非常简单的问题。[/quote]感觉有法写没,没法我就不做了[/quote] 肯定有啊,这么个简答问题。 先用a inner join b inner join e 得到一组数据。 然后在 a inner join c inner join e where a,id not in 上边那组数据a.id 然后在 a inner join d inner join e where a,id not in 上边那两组数据a.id 三组数据union到一起就对了
我是三峡移民 2017-03-04
  • 打赏
  • 举报
回复
引用 7 楼 sinat_28984567 的回复:
[quote=引用 6 楼 qq_34082025 的回复:] [quote=引用 5 楼 sinat_28984567 的回复:] [quote=引用 3 楼 qq_34082025 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
很明显不是这个啊,这个我自己都会写,我要判断那种的,你这样写有重复性,DISTINCT,也是不可靠的[/quote] 你最后要哪个表的数据?还是三个连接表所有的数据?B、C、D三个表结构一样吗? 最好给出测试数据和想要的结果。对大家理解你的问题也有帮助。[/quote]最后是个综合数据,测试数据没必须吧,其实就是个if ,else的,按算法来看就是一个小问题,就是sql怎么写,我是一点思路都没有,if exists( is null),我试过,没法用[/quote] 恩你这个问题应该是个非常简单的问题。[/quote]感觉有法写没,没法我就不做了
我是三峡移民 2017-03-04
  • 打赏
  • 举报
回复
不行,在线等,大神
我是三峡移民 2017-03-04
  • 打赏
  • 举报
回复
引用 7 楼 sinat_28984567 的回复:
[quote=引用 6 楼 qq_34082025 的回复:] [quote=引用 5 楼 sinat_28984567 的回复:] [quote=引用 3 楼 qq_34082025 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
很明显不是这个啊,这个我自己都会写,我要判断那种的,你这样写有重复性,DISTINCT,也是不可靠的[/quote] 你最后要哪个表的数据?还是三个连接表所有的数据?B、C、D三个表结构一样吗? 最好给出测试数据和想要的结果。对大家理解你的问题也有帮助。[/quote]最后是个综合数据,测试数据没必须吧,其实就是个if ,else的,按算法来看就是一个小问题,就是sql怎么写,我是一点思路都没有,if exists( is null),我试过,没法用[/quote] 恩你这个问题应该是个非常简单的问题。[/quote] 嵌套查询应该是可以做出来,我自己去试试了
二月十六 2017-03-04
  • 打赏
  • 举报
回复
引用 6 楼 qq_34082025 的回复:
[quote=引用 5 楼 sinat_28984567 的回复:] [quote=引用 3 楼 qq_34082025 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
很明显不是这个啊,这个我自己都会写,我要判断那种的,你这样写有重复性,DISTINCT,也是不可靠的[/quote] 你最后要哪个表的数据?还是三个连接表所有的数据?B、C、D三个表结构一样吗? 最好给出测试数据和想要的结果。对大家理解你的问题也有帮助。[/quote]最后是个综合数据,测试数据没必须吧,其实就是个if ,else的,按算法来看就是一个小问题,就是sql怎么写,我是一点思路都没有,if exists( is null),我试过,没法用[/quote] 恩你这个问题应该是个非常简单的问题。
我是三峡移民 2017-03-04
  • 打赏
  • 举报
回复
引用 5 楼 sinat_28984567 的回复:
[quote=引用 3 楼 qq_34082025 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
很明显不是这个啊,这个我自己都会写,我要判断那种的,你这样写有重复性,DISTINCT,也是不可靠的[/quote] 你最后要哪个表的数据?还是三个连接表所有的数据?B、C、D三个表结构一样吗? 最好给出测试数据和想要的结果。对大家理解你的问题也有帮助。[/quote]最后是个综合数据,测试数据没必须吧,其实就是个if ,else的,按算法来看就是一个小问题,就是sql怎么写,我是一点思路都没有,if exists( is null),我试过,没法用
二月十六 2017-03-04
  • 打赏
  • 举报
回复
引用 3 楼 qq_34082025 的回复:
[quote=引用 2 楼 sinat_28984567 的回复:] 是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
很明显不是这个啊,这个我自己都会写,我要判断那种的,你这样写有重复性,DISTINCT,也是不可靠的[/quote] 你最后要哪个表的数据?还是三个连接表所有的数据?B、C、D三个表结构一样吗? 最好给出测试数据和想要的结果。对大家理解你的问题也有帮助。
我是三峡移民 2017-03-04
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
如果A表中B,C表字段都存在,你这样连,会造成,B,C表都连到E,组合,去重复事实上数据不一定的,我要的是B,C存在的情况下,取B连接到E
我是三峡移民 2017-03-04
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
很明显不是这个啊,这个我自己都会写,我要判断那种的,你这样写有重复性,DISTINCT,也是不可靠的
二月十六 2017-03-04
  • 打赏
  • 举报
回复
是想得到E表数据吗?
SELECT DISTINCT * FROM
(
select  E.* 
from A left join  B on A.字段=B.字段 left join E ON E.字段=B.字段
UNION ALL
select  E.* 
from A left join  C on A.字段=C.字段 left join E ON E.字段=C.字段
UNION ALL
select  E.* 
from A left join  D on A.字段=D.字段 left join E ON E.字段=D.字段
)t
加载更多回复(1)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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