关于SQL多表联查,当表不完全关联时如何查询?

xhliugreat 2015-10-07 11:41:40
如题,现有两个表,结构如下:两个表没有任何约束关系

文章分类表(被引用的表)
ID  一级分类  二级分类  三级分类  上级分类
01   新闻    NULL    NULL   NULL
02   NULL   国内新闻    NULL   01
03   NULL   国际新闻    NULL   01
04   NULL   省内新闻    NULL   01
05   NULL    NULL   娱乐新闻   04
06   NULL    NULL   科技动态   04
07   NULL    NULL   娱乐新闻   03
08   NULL    NULL   科技动态   03
09   故事    NULL    NULL   NULL
10   NULL   本地故事    NULL   09

文章表(主表)这个表的类别列,填任何值都可以,不一定是文章分类表中的某一个ID
ID   标题     一级分类  二级分类  三级分类
01 这是第一篇文章   01    NULL    NULL
02 这是第二篇文章   01    02     NULL
03 这是第三篇文章   01    03     NULL
04 这是第四篇文章   01    04     NULL
05 这是第五篇文章   01    04     05
06 这是第六篇文章   01    04     05
07 这是第七篇文章   01    03     07
08 这是第八篇文章   09    NULL    NULL
09 这是第九篇文章   09    10     NULL

我希望联查后的结果
ID   标题     一级分类  二级分类  三级分类
01 这是第一篇文章   新闻    NULL    NULL
02 这是第二篇文章   新闻   国内新闻   NULL
03 这是第三篇文章   新闻   国际新闻   NULL
04 这是第四篇文章   新闻   省内新闻   NULL
05 这是第五篇文章   新闻   省内新闻  娱乐新闻
06 这是第六篇文章   新闻   省内新闻  娱乐新闻
07 这是第七篇文章   新闻   国际新闻  娱乐新闻
08 这是第八篇文章   故事    NULL    NULL
09 这是第九篇文章   故事   本地故事 NULL

或者
ID   标题     一级分类  二级分类  三级分类
01 这是第一篇文章   新闻   
02 这是第二篇文章   新闻   国内新闻
03 这是第三篇文章   新闻   国际新闻
04 这是第四篇文章   新闻   省内新闻
05 这是第五篇文章   新闻   省内新闻  娱乐新闻
06 这是第六篇文章   新闻   省内新闻  娱乐新闻
07 这是第七篇文章   新闻   国际新闻  娱乐新闻
08 这是第八篇文章   故事
09 这是第九篇文章   故事   本地故事




问题写的比较乱,主体意思是:当主表和辅表不能一一对应的时候,,如何联查?
别问我为什么表结构这么建,如果表结构建成ID、名称、上级ID这样的话,我也会查了!

感谢有经验的朋友帮忙做一下实验,给一个切实可行的办法
...全文
1610 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhliugreat 2015-10-08
  • 打赏
  • 举报
回复

SELECT 标题,
(SELECT 文章分类表.一级分类名 FROM 文章分类表 WHERE  文章分类表.ID=CAST(文章表.一级分类ID AS INT)) AS 一级分类别名
,(SELECT 文章分类表.二级分类名 FROM 文章分类表 WHERE  文章分类表.ID=CAST(文章表.二级分类ID AS INT)) AS 二级分类别名
,(SELECT 文章分类表.三级分类名 FROM 文章分类表 WHERE  文章分类表.ID=CAST(文章表.三级分类ID AS INT)) AS 三级分类别名
FROM 文章表
xhliugreat 2015-10-08
  • 打赏
  • 举报
回复
呵呵,CSDN真是神了,几十天没解决的问题,在刚刚发了贴子之后不到60分钟之内解决了!办法如下:

SELECT 标题,
(SELECT 文章分类表.一级分类名 FROM 文章分类表 WHERE  文章分类表.ID=CAST(文章表.一级分类ID AS INT)) AS 一级分类
,(SELECT 文章分类表.二级分类名 FROM 文章分类表 WHERE  文章分类表.ID=CAST(文章表.二级分类ID AS INT)) AS 一级分类
,(SELECT 文章分类表.三级分类名 FROM 文章分类表 WHERE  文章分类表.ID=CAST(文章表.三级分类ID AS INT)) AS 一级分类
FROM 文章表
xhliugreat 2015-10-08
  • 打赏
  • 举报
回复

SELECT A.标题,B.一级分类,C.二级分类,D.三级分类
FROM  文章表 AS A INNER JOIN
      文章分类表 AS CA ON A.一级分类 = CA.ClassID INNER JOIN
      文章分类表  AS CB ON A.二级分类 = CB.ClassID INNER JOIN
      文章分类表  AS CC ON A.三级分类 = CC.ClassID
我试过这样的语句,只有当文章表的一级分类、二级分类、三级分类字段中都不为null且在文章分类表中都有记录时才能查到 我希望,当文章表的一级分类、二级分类、三级分类,这三个字段中有任何一个字段不为null,且能在文章分类表中找到对应记录时,都能显示出来。 当然,如果文章表的一级分类、二级分类、三级分类,这三个字段中有任何一个字段不为null时,无论能不能在分类表中找到对应记录,都能查到的话最好。如果在分类表中未到表相应记录时,则该字段显示NULL,这样的话,当文章表中的记录为: ID   标题     一级分类  二级分类  三级分类 49 这是第一篇文章   NULL   NULL   NULL 50 这是第一篇文章   22     23    24 这样的记录,因为文章分类表中没有ID为22、23、24的记录,如果也能查出来的话最好!
道玄希言 2015-10-08
  • 打赏
  • 举报
回复
也可以用左连接来实现。


;with 文章分类表(ID,一级分类,二级分类,三级分类,上级分类) as
(
select '01', '新闻', 'NULL', 'NULL', 'NULL' union all
select '02', 'NULL', '国内新闻', 'NULL', '01' union all
select '03', 'NULL', '国际新闻', 'NULL', '01' union all
select '04', 'NULL', '省内新闻', 'NULL', '01' union all
select '05', 'NULL', 'NULL', '娱乐新闻', '04' union all
select '06', 'NULL', 'NULL', '科技动态', '04' union all
select '07', 'NULL', 'NULL', '娱乐新闻', '03' union all
select '08', 'NULL', 'NULL', '科技动态', '03' union all
select '09', '故事', 'NULL', 'NULL', 'NULL' union all
select '10', 'NULL', '本地故事', 'NULL', '09'
),
文章表(ID, 标题,一级分类,二级分类,三级分类) as
(
select '01', '这是第一篇文章', '01', 'NULL', 'NULL' union all
select '02', '这是第二篇文章', '01', '02', 'NULL' union all
select '03', '这是第三篇文章', '01', '03', 'NULL' union all
select '04', '这是第四篇文章', '01', '04', 'NULL' union all
select '05', '这是第五篇文章', '01', '04', '05' union all
select '06', '这是第六篇文章', '01', '04', '05' union all
select '07', '这是第七篇文章', '01', '03', '07' union all
select '08', '这是第八篇文章', '09', 'NULL', 'NULL' union all
select '09', '这是第九篇文章', '09', '10', 'NULL'
)	     

select 
   标题, isnull(a.一级分类,''), isnull(b.二级分类,''), isnull(c.三级分类,'')
FROM 文章表 as t
left join 文章分类表 as a
on a.id = t.一级分类
left join 文章分类表 as b
on b.id = t.二级分类
left join 文章分类表 as c
on c.id = t.三级分类

27,579

社区成员

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

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