我的带有子查询的查询不会 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
我在 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