Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中使用不同的内部联接_Sql_Distinct_Inner Join - Fatal编程技术网

在SQL中使用不同的内部联接

在SQL中使用不同的内部联接,sql,distinct,inner-join,Sql,Distinct,Inner Join,我有三张表,A,B,C,其中A是多对一B,B是多对一C。我想要一张A中所有C的列表 我的表是这样的:A[id,valueA,lookupB],B[id,valueB,lookupC],C[id,valueC]。我已经编写了一个带有两个嵌套选择的查询,但我想知道是否有可能以某种方式使用DISTINCT进行内部连接 SELECT valueC FROM C INNER JOIN ( SELECT DISTINCT lookupC FROM B INNER JOIN (

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

我的表是这样的:A[id,valueA,lookupB],B[id,valueB,lookupC],C[id,valueC]。我已经编写了一个带有两个嵌套选择的查询,但我想知道是否有可能以某种方式使用DISTINCT进行内部连接

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 DISTINCT C.valueC
FROM 
C
INNER JOIN B ON C.id = B.lookupC
INNER JOIN A ON B.id = A.lookupB

我相信你的1:m关系应该已经隐式地创建了不同的连接

但是,如果您的目标只是每个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
我看不出有什么好的理由来限制a和B的结果集,因为你想要的是a引用的所有C的列表。我对C.valueC做了一个独特的定义,因为我猜你想要一个唯一的C列表


编辑:我同意你的观点。即使你的解决方案看起来有点嵌套,它似乎是利用你的数据知识和减少结果集的最好、最快的方法


没有可以使用的独特连接构造,因此只需保留现有的结构即可:)

我使用以下表格对MS SQL 2005进行了测试:a 400K行、B 26K行和C 450行

估计的查询计划表明,基本内部联接比嵌套子查询慢3倍,但是,当实际运行查询时,基本内部联接的速度是嵌套查询的两倍,基本内部联接在非常小的服务器硬件上花费了297ms


您使用的是什么数据库,您看到的是什么时间?我认为,如果您看到性能不佳,那么可能是索引问题。

不幸的是,这似乎非常缓慢,因为它需要先创建巨大的连接表。当我运行我的代码时,它会更快,我想这是因为它会修剪连接表。我已经颠倒了连接顺序,这取决于您使用的SQL,可能会提高查询的性能。结果是一样的,但似乎较慢。我不知道确切的原因,但我猜这是因为它创建了两个巨大的C连接表。因为我知道B.lookupC本身应该是不同的,所以我想利用这些知识来加快速度,这是一个索引问题。我正在使用MSSQL 2005,终于找到了数据库引擎优化顾问。我在A.lookupB上添加了一个索引,它大大加快了速度。谢谢你的帮助!结果证明这已经足够了,我的问题是我没有一个索引。
SELECT DISTINCT C.valueC 
FROM C 
  LEFT JOIN B ON C.id = B.lookupC
  LEFT JOIN A ON B.id = A.lookupB
WHERE C.id IS NOT NULL