【问题标题】:Not IN operator in mysql returns NULLmysql 中的非 IN 运算符返回 NULL
【发布时间】:2016-07-15 13:07:51
【问题描述】:
                SELECT *
                FROM fabric_restock AS fabr
                LEFT JOIN fabric_po AS fabpo 
                ON fabpo.fab_id = fabr.fab_id
                WHERE 
                fabr.fab_id NOT IN (     
                SELECT fabpo.fab_id
                FROM 
                fabric_po fabpo
                WHERE
                fabpo.status <= 1
                AND 
                fabpo.fab_id IS NOT NULL
                )
                AND 
                fabr.restock_ten <= fabpo.qty

//子查询不返回行或返回null时,完整查询返回null

我该如何解决这个问题?

当子查询没有返回记录时,它应该从外部查询返回所有记录

编辑:原始查询:

                SELECT *
                FROM fabric_restock AS fabr
                LEFT JOIN fabric_po AS fabpo ON fabpo.fab_id = fabr.fab_id
                WHERE 
                fabr.fab_id NOT IN (
                SELECT fabpo.fab_id
                FROM 
                fabric_po fabpo
                JOIN 
                fabric_challan fabchallan
                ON 
                fabpo.po_num =  fabchallan.po_num
                WHERE
                fabchallan.challan_num 
                NOT IN (SELECT challan_num FROM fabric_grn)
                AND 
                fabpo.status <= 1
                )
                AND 
                fabr.restock_ten <= fabpo.qty

样本数据:

    # fab_id, fabric_mother_id, qty_mother, cluster, qty, cf_thirty, cf_ten, cf_three, cf_cluster, sellout_thirty, sellout_ten, sellout_three, num_good_sku, num_coll, num_collection_p, num_sale, new_cf, percentile, restock_thirty, restock_ten, restock_three, status, num_new, parent, lace_type, po_id, po_num, fab_id, vendor_code, color_code, qty, estimated_price, po_date, arrival_date, estimated_date, composition, material, type, inType, status, gsm, notes, image, approveStatus, approve_date, shrinkage, fabric_mother_id, qty_type, main_construction, place_order_date, width, vendor_comments, email_send, wash, brand
FAB1001, SBL104, 10.00, cluster, 10.00, 10.00, 10.00, 10.00, 10, 10.00, 10.00, 10.00, 10, 10, 10, 10, 10.00, 10.00, 10.00, 10.00, 10.00, 0, 10, 1, Washed, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 
FAB1002, SBL101, 20.00, cluster1, 20.00, 20.00, 20.00, 20.00, 20, 20.00, 20.00, 20.00, 20, 20, 20, 20, 20.00, 20.00, 20.00, 20.00, 20.00, 0, 20, 2, Bleached, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 
FAB1003, SBL102, 30.00, cluster2, 30.00, 30.00, 30.00, 30.00, 30, 30.00, 30.00, 30.00, 30, 30, 30, 30, 30.00, 30.00, 30.00, 30.00, 30.00, 0, 30, 3, RFD, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 
FAB1004, SBL103, 40.00, cluster3, 40.00, 40.00, 40.00, 40.00, 40, 40.00, 40.00, 40.00, 40, 40, 40, 40, 40.00, 40.00, 10.00, 10.00, 10.00, 0, 40, 4, Dyed, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 

fabpo 表:目前为空

【问题讨论】:

  • @Drew:我理解,但不知道如何用 NOT EXISTS 替换这个特定的查询
  • 你能提供一些样本数据和预期的结果吗?我猜到了你想要做什么,但现在我不太确定我是否做对了
  • @Philipp:需要从fabricrestock 表中过滤掉fabricpo 表中有行且状态
  • 您是否尝试将fabpo.fab_id IS NOT NULL 添加到您的子查询中?您在第一个示例中有它,但在第二个示例中没有

标签: mysql


【解决方案1】:

您正在加入一个空表。没关系。

但稍后您尝试将表中的值与连接表中的空字段进行比较,这不起作用。

fabr.restock_ten <= fabpo.qty

fabpo 表:目前为空

我想你可以通过检查 fabpo.qty 上的 null 来处理这种情况,虽然这有点奇怪(可能只是因为我并不真正理解所有列名的含义)。

AND (fabr.restock_ten <= fabpo.qty OR fabpo.qty IS NULL)

【讨论】:

  • 正是我要提出的:)。这是正确的。应该如何解决这个问题?我不能在子查询中使用 restock_ten ,现在结果也不能使用 fabpo.qty 。我该怎么办?
  • 你可以检查空值,或者你可以使用fabr.restock_ten &lt;= IFNULL(fabpo.qty, 0)将空值变成0,但是我猜你也不会得到结果(你也可以把它变成一些非常高的值, 得到结果)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多