在SQL中使用DISTINCT内部联接

Mat*_*son 36 sql inner-join distinct

我有三个表,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
Run Code Online (Sandbox Code Playgroud)

编辑:表格相当大,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
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*ler 15

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

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

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


Jon*_*ski 9

我相信你的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
Run Code Online (Sandbox Code Playgroud)

  • 结果证明已经足够了,我遇到的问题是我没有适当的索引。 (2认同)