【问题标题】:Error executing query with table join does not display使用表连接执行查询时出错不显示
【发布时间】:2019-02-20 05:43:33
【问题描述】:

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

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呢?我哪里错了请帮帮我。

【问题讨论】:

    标签: sql postgresql sql-null


    【解决方案1】:

    知道B.PRODUCT_ID 字段的值将与P.PRODUCT_ID 相同, NULL,您可以使用the IS NULL and IS NOT NULL comparison operators 来询问而是提问。

    SELECT […] (B.PRODUCT_ID IS NOT NULL) AS PRODUCT_IS_IN_BOOKMARKS […]
    

    您正在处理horror of NULLthree-value logic。 NULL 让一切变得困难!

    不显示书签列false,但是否为空?

    简短说明:NULL 不是一个值;它是非值占位符。问“这个值是否等于 don't-have-a-value?”没有有意义的答案,因此 SQL 规定响应为 NULL。

    更长的解释:您的联接是LEFT JOIN,因此您要求行即使该联接的右侧没有任何内容。当 BOOKMARKS 表中没有对应的元组时,其在结果集中的列为 NULL。因此,当没有相应的 BOOKMARKS 记录时,您的计算字段 (B.PRODUCT_ID = P.PRODUCT_ID AND B.USER_ID = B.USER_ID) 将与 NULL 比较是否相等;所以会得到结果NULL

    【讨论】:

      【解决方案2】:

      似乎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 视为正常值。

      【讨论】:

        【解决方案3】:

        您可以使用 coalesce() 将 null 替换为您的 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-27
          • 1970-01-01
          • 2020-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-11
          相关资源
          最近更新 更多