MYSQL NOT IN subselect

时间:2014-01-31 07:19:28

标签: mysql sql

我有两张桌子

  1. item
  2. confirmmasterdetail
  3. 我想从item表中选择不在confirmmasterdetail表中的记录 当我运行此查询时,它返回空结果集。

    SELECT itemId
    ,      itemName
    FROM   item
    LEFT 
    JOIN   item /* HERE AN ALIAS IS MISSING, ITEM occurs twice. */
    ON     item.itemId = confirmmasterdetail.itemId
    WHERE  confirmmasterdetail.itemId 
           NOT IN 
           ( SELECT confirmmasterdetail.itemId
             FROM   confirmmasterdetail
           )
    AND    confirmMasterId = ".$_REQUEST['confirmMasterId'];
    

4 个答案:

答案 0 :(得分:1)

查看您的查询。请为使用任一表名选择的所有列添加前缀,或者(更好)为每个表添加别名并使用该表。另请注意,item在查询中出现两次,因此列名可能与它们看起来不同。

最后,确保无法从子选择中返回null

答案 1 :(得分:0)

我相信你的查询有SQL的基本概念问题。如果没有明确说明你想要什么以及表格是什么样的话,很难给出建议。为了帮助您,我们至少需要有关表格的信息(列和它们是如何连接的)。

修改:根据您提供的信息,您可能想尝试其中一种查询:

  1. 选择confirmmasterdetail中没有相应条目的所有项目:

    SELECT itemId
    ,      itemName
    FROM   item
    WHERE  item.itemId 
           NOT IN 
           ( SELECT confirmmasterdetail.itemId
             FROM   confirmmasterdetail
           );
    
  2. 使用给定的confirmMasterId选择confirmmasterdetail中没有条目的所有项目:

    SELECT itemId
    ,      itemName
    FROM   item
    WHERE  item.itemId 
           NOT IN 
           ( SELECT confirmmasterdetail.itemId
             FROM   confirmmasterdetail
             WHERE  confirmMasterId = ".$_REQUEST['confirmMasterId']
           );
    

答案 2 :(得分:0)

SQL中null有一个重要的事情,它意味着unknown而不是nothing。因此,如果您的子查询返回null值,则表示unknown,而not in unknown会使DBMS忽略所有记录。

只需将子查询更改为:

SELECT confirmmasterdetail.itemId
  FROM confirmmasterdetail
 WHERE confirmmasterdetail.itemId is not null

答案 3 :(得分:0)

尝试此查询 -

SELECT
  i.*
FROM item i
  LEFT JOIN confirmmasterdetail c
    ON i.itemId = c.itemId
WHERE
  c.itemId IS NULL