使用表联接执行查询时出错,但不显示

时间:2019-02-20 05:43:34

标签: sql postgresql sql-null

用户在该产品的书签中有一个查询,还会考虑该产品的喜欢并在表中显示所有产品:

SELECT P.*, 
  COUNT(L.USER_ID) AS LIKES, 
  (B.PRODUCT_ID = P.PRODUCT_ID AND B.USER_ID = B.USER_ID) AS BOOKMARKS 
    FROM PRODUCTS AS P 
      LEFT JOIN LIKES_PRODUCTS AS L ON (L.PRODUCT_ID = P.PRODUCT_ID) 
      LEFT JOIN BOOKMARKS_PRODUCTS AS B ON (B.PRODUCT_ID = P.PRODUCT_ID)
        GROUP BY P.PRODUCT_ID, B.PRODUCT_ID, B.USER_ID ORDER BY P.PRODUCT_ID

但是他将产品添加到产品的现有产品中,并且不显示false,而仅显示true,并且错误显示null表示其位置:

product_id |  product_name | ... | LIKES | BOOKMARKS |
------------------------------------------------------
     1     |     name 1    | ... |   0   |   true    |
     1     |     name 1    | ... |   0   |   true    |
     2     |     name 2    | ... |   0   |   NULL    |
     3     |     name 3    | ... |   0   |   NULL    |
     4     |     name 4    | ... |   0   |   NULL    |

他为什么要为我添加一个额外的产品1,并且不显示书签列false,但是却显示null?我在哪里错了请帮助我。

3 个答案:

答案 0 :(得分:1)

似乎B.PRODUCT_IDP.PRODUCT_IDB.USER_IDB.USER_ID中的某些具有SQL NULL值,因此结果为NULL。

“ NULL”在SQL中表示“未知”。

如果检查两项是否相等,而其中一项未知,则结果未知。

如果必须满足两个条件,但一个条件的结果未知,则总结果未知。

简而言之,NULL是“可传染的”。

也许这就是您想要的:

    B.PRODUCT_ID IS NOT DISTINCT FROM P.PRODUCT_ID
AND B.USER_ID    IS NOT DISTINCT FROM B.USER_ID

IS NOT DISTINCT FROM类似于=,但它将NULL视为正常值。

答案 1 :(得分:1)

在知道SELECT […] (B.PRODUCT_ID IS NOT NULL) AS PRODUCT_IS_IN_BOOKMARKS […] 字段将与LEFT JOIN NULL相同的情况下,您可以使用{{ 3}}来问这个问题。

(B.PRODUCT_ID = P.PRODUCT_ID AND B.USER_ID = B.USER_ID)

您正在处理the IS NULL and IS NOT NULL comparison operatorshorror of NULL。 NULL使一切变得困难!

  

不将书签列显示为false,但是它为空吗?

简短说明:NULL不是值;它是非值占位符。询问“此值等于不具有一个值吗?”没有有意义的答案,因此SQL指示响应为NULL。

更长的解释:您的联接是NULL,因此即使在右边没有任何内容,您也要查询行。当BOOKMARKS表中没有对应的元组时,其在结果集中的列为NULL。因此,当没有对应的BOOKMARKS记录时,您的计算字段scipy.ndi.distance_transform_edt()将比较是否为NULL;因此将得到结果spiral()

答案 2 :(得分:1)

您可以使用coalesce()将null替换为其他未知ID,这些ID可能永远不会在您的ID中返回false 因为null = null检查是不可能的

SELECT P.*, 
  COUNT(L.USER_ID) AS LIKES, 
  (coalesce(B.PRODUCT_ID,-99999) = P.PRODUCT_ID AND ) AS BOOKMARKS 
    FROM PRODUCTS AS P 
      LEFT JOIN LIKES_PRODUCTS AS L ON (L.PRODUCT_ID = P.PRODUCT_ID) 
      LEFT JOIN BOOKMARKS_PRODUCTS AS B ON (B.PRODUCT_ID = P.PRODUCT_ID)
        GROUP BY P.PRODUCT_ID, B.PRODUCT_ID, B.USER_ID ORDER BY P.PRODUCT_ID