ERROR: invalid reference to FROM-clause entry for table "oth"

ERROR: invalid reference to FROM-clause entry for table "oth"

我对此查询有疑问

SELECT DISTINCT(oth.book) FROM book_meta_keywords oth, 
                (SELECT bmk.meta_keyword AS metaKeyword, bmk.book AS book FROM books b
                    INNER JOIN customers_books cvb ON cvb.book = b.id
                    INNER JOIN book_meta_keywords bmk ON bmk.book = b.id
                    WHERE cvb.customer = 1 ) AS allCustomerPurchasedBooksMeta 
            INNER JOIN books b ON b.id = oth.book
            WHERE oth.meta_keyword = allCustomerPurchasedBooksMeta.metaKeyword AND oth.book != allCustomerPurchasedBooksMeta.book AND b.status = 'GOOD'

我遇到此查询的错误。

错误:对 table“oth”的 FROM 子句条目的引用无效 第 6 行:INNER JOIN books b ON b.id = oth.book ^ 提示:table“oth”有一个条目,但不能从这部分查询中引用它。 , 时间: 0.002000s

但是如果我 运行 下面的查询有效

SELECT DISTINCT(oth.book) FROM book_meta_keywords oth, 
                (SELECT bmk.meta_keyword AS metaKeyword, bmk.book AS book FROM books b
                    INNER JOIN customers_books cvb ON cvb.book = b.id
                    INNER JOIN book_meta_keywords bmk ON bmk.book = b.id
                    WHERE cvb.customer = 1 ) AS allCustomerPurchasedBooksMeta 
            WHERE oth.meta_keyword = allCustomerPurchasedBooksMeta.metaKeyword AND oth.book != allCustomerPurchasedBooksMeta.book

任何人都可以帮助我,为什么...查询基本上是尝试根据购买的图书的元关键字来获取类似的图书。

谢谢。

你不见了join

SELECT DISTINCT oth.book FROM book_meta_keywords oth join
                (SELECT bmk.meta_keyword AS metaKeyword, bmk.book AS book FROM books b
                    INNER JOIN customers_books cvb ON cvb.book = b.id
                    INNER JOIN book_meta_keywords bmk ON bmk.book = b.id
                    WHERE cvb.customer = 1 ) AS allCustomerPurchasedBooksMeta 
on oth.meta_keyword = allCustomerPurchasedBooksMeta.metaKeyword and 
   oth.book != allCustomerPurchasedBooksMeta.book
            INNER JOIN books b ON b.id = oth.book
            WHERE  b.status = 'GOOD'

这是您的 FROM 子句:

FROM 
    book_meta_keywords oth, 
    (SELECT ... FROM ... WHERE ...) AS allCustomerPurchasedBooksMeta 
    INNER JOIN books b ON b.id = oth.book

您混合了显式和隐式联接(后者用逗号表示)。不。它们有不同的优先规则,查询规划器最终会在看到 oth 之前评估第二个条件。

至于如何解决:假设逻辑确实是你想要的,那就是横向连接:

FROM 
    book_meta_keywords oth 
    CROSS JOIN LATERAL (SELECT ... FROM ... WHERE ...) AS allCustomerPurchasedBooksMeta 
    INNER JOIN books b ON b.id = oth.book

不过,我怀疑您的查询可以进一步简化。您可能想为此问另一个问题,解释查询的目的并提供最小可重现的示例。

嗯它可以工作:

SELECT DISTINCT oth.book 
FROM book_meta_keywords oth
     INNER JOIN books b ON b.id = oth.book
     , (SELECT bmk.meta_keyword AS metaKeyword, bmk.book AS book 
        FROM books b
        INNER JOIN customers_books cvb ON cvb.book = b.id
        INNER JOIN book_meta_keywords bmk ON bmk.book = b.id
        WHERE cvb.customer = 1 ) AS allCustomerPurchasedBooksMeta 
WHERE oth.meta_keyword = allCustomerPurchasedBooksMeta.metaKeyword 
     AND oth.book != allCustomerPurchasedBooksMeta.book 
     AND b.status = 'GOOD'

但这是否满足您的需求...