我的带有子查询的查询不会 return 空集

My Query with a sub-query won't return an empty set

我在 MySQL 中有两个 table:

Table 1 - 工单

ID QUANTITY
1 2
2 1

Table 2 - 工作订单中的项目

ID WORKORDER
1 1
2 1
3 2

我有一个问题:

SELECT WORKORDERS.ID
      , WORKORDERS.QUANTITY AS NOMINAL_QTY
      , COUNT(ITEMSINWORKORDERS.WORKORDER) AS ENTERED_QTY 
FROM  WORKORDERS JOIN ITEMSINWORKORDERS ON 
         ITEMSINWORKORDERS.WORKORDER = WORKORDERS.ID 
WHERE WORKORDERS.QUANTITY > 
        ( SELECT COUNT(ITEMSINWORKORDERS.WORKORDER ) 
          FROM   WORKORDERS INNER JOIN ITEMSINWORKORDERS ON 
                    ITEMSINWORKORDERS.WORKORDER = WORKORDERS.ID 
        ) 

最初,我的语句中有一个左外连接,所以我将其切换为内连接,希望得到一个空集。当没有缺少条目的工单时,任何人都有关于将其 return 设为空集的建议吗? 它旨在查找所有未输入所有项目的工作订单,并且在 WORKORDERS table 中输入的标称数量大于 ITEMSINWORKORDERS 中与该工作订单对应的记录数。我希望 return 一个空集。相反,我得到

ID NOMINAL_QTY ENTERED_QTY
NULL NULL 0

最初,我的语句中有一个左外连接,所以我将其切换为内连接,希望得到一个空集。

附录: 我尝试使用 NULLIF 自己解决这个问题:

SELECT WORKORDERS.ID
    , WORKORDERS.QUANTITY AS NOMINAL_QTY
    , NULLIF(COUNT(ITEMSINWORKORDERS.WORKORDER), 0) AS ENTERED_QTY 
FROM WORKORDERS JOIN ITEMSINWORKORDERS ON 
    ITEMSINWORKORDERS.WORKORDER = WORKORDERS.ID 
WHERE WORKORDERS.QUANTITY > 
    ( SELECT COUNT( ITEMSINWORKORDERS.WORKORDER ) 
    FROM WORKORDERS INNER JOIN ITEMSINWORKORDERS ON 
        ITEMSINWORKORDERS.WORKORDER = WORKORDERS.ID 
    ) 

我得到的结果令人沮丧:

ID NOMINAL_QTY ENTERED_QTY
NULL NULL NULL

我不知道你期望什么,因为你的查询没有提供任何行。

但是为了计数你需要 GROUP BY

CREATE TABLE WORKORDERS (
  `ID` INTEGER,
  `QUANTITY` INTEGER
);

INSERT INTO WORKORDERS
  (`ID`, `QUANTITY`)
VALUES
  ('1', '2'),
  ('2', '1');

CREATE TABLE ITEMSINWORKORDERS (
  `ID` INTEGER,
  `WORKORDER` INTEGER
);

INSERT INTO ITEMSINWORKORDERS
  (`ID`, `WORKORDER`)
VALUES
  ('1', '1'),
  ('2', '1'),
  ('3', '2');
SELECT WORKORDERS.ID
      , WORKORDERS.QUANTITY AS NOMINAL_QTY
      , COUNT(ITEMSINWORKORDERS.WORKORDER) AS ENTERED_QTY 
FROM  WORKORDERS JOIN ITEMSINWORKORDERS ON 
         ITEMSINWORKORDERS.WORKORDER = WORKORDERS.ID 
WHERE WORKORDERS.QUANTITY > 
        ( SELECT COUNT(ITEMSINWORKORDERS.WORKORDER ) 
          FROM   WORKORDERS INNER JOIN ITEMSINWORKORDERS ON 
                    ITEMSINWORKORDERS.WORKORDER = WORKORDERS.ID 
        ) 
GROUP BY WORKORDERS.ID
      , WORKORDERS.QUANTITY
ID | NOMINAL_QTY | ENTERED_QTY
-: | ----------: | ----------:
SELECT COUNT(ITEMSINWORKORDERS.WORKORDER ) 
          FROM   WORKORDERS INNER JOIN ITEMSINWORKORDERS ON 
                    ITEMSINWORKORDERS.WORKORDER = WORKORDERS.ID
| COUNT(ITEMSINWORKORDERS.WORKORDER ) |
| ----------------------------------: |
|                                   3 |

db<>fiddle here