2 williamkzhy WilliamKZhy 于 2017.09.08 17:45 提问

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

为了方便说明,我以下将简单描述表名和列名。
现在有三个表,基础数据表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个回答

qq_24596675
qq_24596675   2017.09.08 17:51

你用inner join 试试

qq_24596675
qq_24596675 回复WilliamKZhy: 对的
3 个月之前 回复
WilliamKZhy
WilliamKZhy 试过了,还是不行。把left join都换成inner join嘛?
3 个月之前 回复
springyh
springyh   2017.09.08 18:39

用左连接 或者右连接 join on 查询

lkhog
lkhog   2017.09.09 23:52

版本三里:L表和A表关联后的数据集与K表和B表关联的数据集没限制条件?肯定会出现笛卡尔积~缺少限制条件
版本二里:B表没有和K表关联~只有A和K关联~肯定笛卡尔积
版本一:同理~。

lkhog
lkhog 回复WilliamKZhy: 至少m和n需要限制条件。不然会出现笛卡尔及
2 个月之前 回复
WilliamKZhy
WilliamKZhy 回复lkhog: l和A关联的临时表m和k和b关联的临时表n再left join在一起,这种?
2 个月之前 回复
lkhog
lkhog 回复WilliamKZhy: 是说L表和A表关联后的数据集与K表和B表关联的数据集之间没有限制条件
2 个月之前 回复
WilliamKZhy
WilliamKZhy b表和k表关联是指加上where条件吗?
2 个月之前 回复
qq_40090700
qq_40090700   2017.09.11 13:34

你使用左连就好了,没看太懂你说的啥意思

Csdn user default icon
上传中...
上传图片
插入图片