Sql 跨3个表连接

Sql 跨3个表连接,sql,select,join,Sql,Select,Join,我试图将3个表连接在一起,并可能从任何列检索数据 我有一个产品和一种生活方式,还有一个“映射表”,它基本上包含了两种生活方式之间的引用 我想使用连接正确地完成这项工作,但事实证明这很麻烦。如果我使用“Where's”它就行了 给你 这会得到比我预期的更多的结果——它可能做了正确的事情,而不是我想要的 SELECT DISTINCT PROFDESC.* FROM PROFDESC INNER JOIN PRODUCT ON PRODFUND.PRODCD = PRODUCT.PRODCD

我试图将3个表连接在一起,并可能从任何列检索数据

我有一个产品和一种生活方式,还有一个“映射表”,它基本上包含了两种生活方式之间的引用

我想使用连接正确地完成这项工作,但事实证明这很麻烦。如果我使用“Where's”它就行了

给你

这会得到比我预期的更多的结果——它可能做了正确的事情,而不是我想要的

SELECT DISTINCT PROFDESC.* 
FROM PROFDESC 
INNER JOIN PRODUCT ON PRODFUND.PRODCD = PRODUCT.PRODCD 
INNER JOIN PRODFUND ON PRODFUND.PDFDCODE = PROFDESC.PROFREF 
WHERE PRODFUND.PDFDTYPE = 2
这可以正常工作,但不会“连接”表

SELECT DISTINCT PROFDESC.* 
FROM PROFDESC, Product, Prodfund 
WHERE 
PRODFUND.PRODCD = PRODUCT.PRODCD and  
PRODFUND.PDFDCODE = PROFDESC.PROFREF 
AND PRODFUND.PDFDTYPE = 2;
我相信我的第一个连接实际上是连接A到B和B到C,因为我希望连接包括A到C


有什么建议吗?

您只需要预先定义查询中的表。这应该行得通

SELECT DISTINCT PROFDESC.* 
FROM PROFDESC 
INNER JOIN PRODFUND ON PRODFUND.PDFDCODE = PROFDESC.PROFREF     
INNER JOIN PRODUCT ON PRODFUND.PRODCD = PRODUCT.PRODCD 
WHERE PRODFUND.PDFDTYPE = 2

您只需要预先定义查询中的表。这应该行得通

SELECT DISTINCT PROFDESC.* 
FROM PROFDESC 
INNER JOIN PRODFUND ON PRODFUND.PDFDCODE = PROFDESC.PROFREF     
INNER JOIN PRODUCT ON PRODFUND.PRODCD = PRODUCT.PRODCD 
WHERE PRODFUND.PDFDTYPE = 2

加入时应使用正确的顺序

SELECT DISTINCT PROFDESC.*
FROM
    PROFDESC
    INNER JOIN PRODFUND
        ON PROFDESC.PROFREF = PRODFUND.PDFDCODE
    INNER JOIN PRODUCT
        ON PRODFUND.PRODCD = PRODUCT.PRODCD  
WHERE
    PRODFUND.PDFDTYPE = 2
但你们为什么要加入到这个产品中去呢?您没有引用其中的任何列。连接是否以某种方式缩小了结果?如果没有,请删除:

SELECT DISTINCT PROFDESC.*
FROM
    PROFDESC
    INNER JOIN PRODFUND
        ON PROFDESC.PROFREF = PRODFUND.PDFDCODE
WHERE
    PRODFUND.PDFDTYPE = 2

然后可能会删除DISTINCT(取决于联接的基数)。

在联接时应该使用正确的顺序

SELECT DISTINCT PROFDESC.*
FROM
    PROFDESC
    INNER JOIN PRODFUND
        ON PROFDESC.PROFREF = PRODFUND.PDFDCODE
    INNER JOIN PRODUCT
        ON PRODFUND.PRODCD = PRODUCT.PRODCD  
WHERE
    PRODFUND.PDFDTYPE = 2
但你们为什么要加入到这个产品中去呢?您没有引用其中的任何列。连接是否以某种方式缩小了结果?如果没有,请删除:

SELECT DISTINCT PROFDESC.*
FROM
    PROFDESC
    INNER JOIN PRODFUND
        ON PROFDESC.PROFREF = PRODFUND.PDFDCODE
WHERE
    PRODFUND.PDFDTYPE = 2

然后可能会删除DISTINCT(取决于联接的基数)。

您能提供一些虚拟数据的表定义和预期结果吗?您能告诉我们表的结构吗?我认为这两个问题都是错误的。在第一个连接中,在第一个连接中,通过使用第三个连接上的表阅读:这是什么RDBMS?使用
DISTINCT PROFDESC.*
消除连接带来的重复项是一种代码气味,如果您使用的是优化此功能的RDBMS,则可能会被
EXISTS
所取代。您能提供一些虚拟数据的表定义和预期结果吗?您能给我们表的结构吗?我认为这两个问题都是错误的。在第一个连接中,在第一个连接中,通过使用第三个连接上的表阅读:这是什么RDBMS?使用
DISTINCT PROFDESC.*
来消除连接带来的重复项是一种代码气味,如果您使用的RDBMS优化了这一点,则可能会被
EXISTS
所取代。Itzik Ben Gan认为这是一种交叉关系。仍然没有解释为什么他们说得到的行比预期的多,而不是解析器错误。是的,我很想知道表之间的关系。哪张桌子在一边,哪张在n一边?伊兹克·本·甘认为这是一种交叉关系。仍然没有解释为什么他们说得到的行比预期的多,而不是解析器错误。是的,我很想知道表之间的关系。哪张桌子在一边,哪张在n一边?