如何编写查询而不使用子查询?

hlswsv35  于 2021-06-17  发布在  Mysql
关注(0)|答案(5)|浏览(270)

我有这个查询,它工作得很好,但我想改进它,编写它没有子查询。这可能吗?虽然我试了很多次,但还是没有得到正确的结果。

SELECT * FROM store_product
    WHERE product_id NOT IN (
                SELECT entity_id
                FROM import_pack_file_element
                    WHERE entity_id IS NOT NULL
                       AND import_pack_file_id IN (135)
                       AND status = 'DONE') AND store_id = 65
aelbi1ox

aelbi1ox1#

您可以尝试这样做(但最好改用子查询):

SELECT [table alias].*
FROM store_product [table alias]
LEFT JOIN import_pack_file_element [table alias] on [table alias].[key] = [table alias].[key]
WHERE [table alias].entity_id IS NOT NULL AND [table alias].import_pack_file_id IN(135) AND [table alias].status = 'DONE'

您可以修改 LEFT JOIN 部分和 WHERE 根据你的需要分开。
还有:[key]到表键,[table alias]到表别名。
同样,u可以替换in(135),使用等号 = ,in用于多个需要比较或验证的元素。
参考文献如下:
左连接

7gcisfzg

7gcisfzg2#

你可以用一个 EXISTS 条款:

SELECT *
FROM store_product sp
WHERE NOT EXISTS (SELECT 1 FROM import_pack_file_element i
                  WHERE i.entity_id = sp.product_id AND 
                        import_pack_file_id = 135 AND status = 'DONE');
ehxuflar

ehxuflar3#

你可以重写一个 NOT EXISTS 或者 NOT IN 查询到反联接。不过,我看不出你为什么要这么做。反连接通常用在有问题的dbms上 [NOT] IN / [NOT] EXISTS ,mysql应该不是这样。反连接是防御dbms弱点的一种手段,其代价是失去可读性。

SELECT sp.*
FROM store_product sp
LEFT JOIN import_pack_file_element ipfe
  ON ipfe.entity_id = sp.product_id
  AND ipfe.import_pack_file_id = 135
  AND ipfe.status = 'DONE'
WHERE ipfe.entity_id IS NULL;
v1uwarro

v1uwarro4#

我不完全了解您的table设计,但这可能有用:

SELECT * FROM store_product x LEFT OUTER JOIN import_pack_file_element y
                              ON x.product_id = y.entity_id
 WHERE x.product_id IS NULL
   AND import_pack_file_id = 135 
   AND status = 'DONE'
5ssjco0h

5ssjco0h5#

可以使用left join和is null条件

SELECT store_product.* 
FROM store_product 
LEFT JOIN import_pack_file_element ON store_product.product_id = import_pack_file_element.entity_id 
    AND import_pack_file_element.import_pack_file_id IN (135)
    AND import_pack_file_element.status = 'DONE'
WHERE  
   import_pack_file_element.entity_id IS NULL

相关问题