WilliamKZhy
WilliamKZhy
2017-09-08 09:45

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

  • 数据
  • sql

为了方便说明,我以下将简单描述表名和列名。
现在有三个表,基础数据表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万多个,我个人觉得应该是笛卡尔积的问题,但是不知道错误出现在哪儿,求指教!

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

4条回答