如何在三个表进行关联查找出想要的数据?

WilliamKZhy 2017-09-08 05:43:23
为了方便说明,我以下将简单描述表名和列名。
现在有三个表,基础数据表A,基础数据详细内容表B,进阶数据表C。,三个表里面都需要用到两个列。
A表里:信息编码code(和B表的内容关联),标注编码ident(和C表的内容关联)。
B表里:信息编码code,信息详情content。
C表里:标注编码ident,信息详情content。
现在我希望通过C表的数据,去回溯找到对应的B表数据。查找到的的结果类似如下(一个基础数据可能对应多个进阶数据):
基础数据B1,进阶数据C1。
基础数据B1,进阶数据C2。
基础数据B1,进阶数据C3。
基础数据B2,进阶数据C4。
基础数据B3,进阶数据C5。
基础数据B4,进阶数据C6。
基础数据B4,进阶数据C7。
我自己写的sql有三个版本,如下:
版本一:------------------------------------------------------------
SELECT 临时表k.content,表C.CONTENT FROM 表C LEFT JOIN (
SELECT 表A.IDENT ident,表B.CONTENT content
FROM 表B INNER JOIN 表A ON 表A.CODE = 表B.CODE
) 临时表k ON 临时表k.ident = 表C.IDENT
版本二:------------------------------------------------------------
WITH 临时表k AS (
SELECT 表C.CONTENT content, 表C.IDENT IDENT FROM 表C
)
SELECT 表B.CONTENT,临时表k.content
FROM 临时表k, 表B
WHERE 表B.CODE IN (
SELECT code FROM 表A
WHERE 表A.IDENT IN(
SELECT IDENT FROM 临时表k
)
)
版本三:-----------------------------------------------------------
select 表B.content,临时表k.content FROM (
SELECT 表A.code code,临时表L.CONTENT content FROM (
SELECT 表C.IDENT IDENT,表C.CONTENT CONTENT FROM 表C
) 临时表L LEFT JOIN 表A ON 表A.IDENT = 临时表L.IDENT
) 临时表k LEFT JOIN 表B ON 表B.CODE = 临时表k.code

----------------------------------------------------
以上三个版本在通过表C对应获取表B数据的时候,都能正确获取,但是当一起对应输出的时候,数据就不对了。
例如本来表C的数据在300个,正确获取到表B的数据应该是200多个,然后汇总对比在一起应该是300行输出,但是汇总输出是4万多个,我个人觉得应该是笛卡尔积的问题,但是不知道错误出现在哪儿,求指教!
...全文
492 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
听雨停了 2017-09-11
  • 打赏
  • 举报
回复

SELECT b.*,c* FROM TabB b
RIGHT OUTER JOIN TabA a ON a.code=b.code
RIGHT OUTER JOIN TabC c ON a.ident=c.ident
--如果你要根据C表的某些ident去查下B表的数据就加上下面这条,如果不要就按上面这样查就可以了
--WHERE c.ident IN (SELECT ident FROM Tabc WHERE ...)
WilliamKZhy 2017-09-11
  • 打赏
  • 举报
回复
引用 1 楼 huangfeng1993 的回复:
你是怎么汇总的呢?
三个版本的sql都是汇总的,最后一层就是汇总。 是这种写法有错吗?
峰峰517 2017-09-10
  • 打赏
  • 举报
回复
你是怎么汇总的呢?

34,590

社区成员

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

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