我有三个表,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慢一倍.
我使用下表对MS SQL 2005进行了测试:400K行,B 26K行和C 450行.
估计的查询计划表明基本的内部联接比嵌套的子查询慢3倍,但是当实际运行查询时,基本内部联接的速度是嵌套查询的两倍,基本的内部联接需要297毫秒.最小的服务器硬件
您使用的数据库是什么,您看到了什么时间?我在想如果你看到性能不佳那么它可能是一个索引问题.
我相信你的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