当前位置:  开发笔记 > 数据库 > 正文

在SQL中使用DISTINCT内部联接

如何解决《在SQL中使用DISTINCT内部联接》经验,为你挑选了2个好方法。

我有三个表,A,B,C,其中A是多对一B,B是多对一C.我想要一个A中所有C的列表.

我的表是这样的:A [id,valueA,lookupB],B [id,valueB,lookupC],C [id,valueC].我用两个嵌套的SELECT编写了一个查询,但我想知道是否有可能以某种方式使用DISTINCT进行INNER JOIN.

SELECT valueC
FROM C
INNER JOIN
(
    SELECT DISTINCT lookupC
    FROM B INNER JOIN
    (
        SELECT DISTINCT lookupB
        FROM A
    ) 
    A2 ON B.id = A2.lookupB
) 
B2 ON C.id = B2.lookupC

编辑:表格相当大,A是500k行,B是10k行,C是100行,所以如果我做一个基本的内部连接并最后使用DISTINCT,有很多不必要的信息,如下所示:

SELECT DISTINCT valueC
FROM 
C INNER JOIN B on C.id = B.lookupB
INNER JOIN A on B.id = A.lookupB

这非常非常慢(比我上面嵌套的SELECT慢一倍.



1> Darrel Mille..:

我使用下表对MS SQL 2005进行了测试:400K行,B 26K行和C 450行.

估计的查询计划表明基本的内部联接比嵌套的子查询慢3倍,但是当实际运行查询时,基本内部联接的速度是嵌套查询的两倍,基本的内部联接需要297毫秒.最小的服务器硬件

您使用的数据库是什么,您看到了什么时间?我在想如果你看到性能不佳那么它可能是一个索引问题.



2> Jonathan Lon..:

我相信你的1:m关系应该已经隐式创建了DISTINCT JOIN.

但是,如果你的目标只是每个A中的C,那么在最外层的查询中使用DISTINCT可能会更容易.

SELECT DISTINCT a.valueA, c.valueC
FROM C
    INNER JOIN B ON B.lookupC = C.id
    INNER JOIN A ON A.lookupB = B.id
ORDER BY a.valueA, c.valueC

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有