SQL帮助使用NESTED SELECTION

时间:2016-02-28 07:38:48

标签: sqlite

这是我的表

CREATE TABLE emp (num INTEGER NOT NULL, 
              name VARCHAR(20) NOT NULL, 
              dept VARCHAR(20) NOT NULL, 
              salary INTEGER NOT NULL,
              boss INTEGER NOT NULL,
              PRIMARY KEY (num),
              FOREIGN KEY (boss) REFERENCES emp (num)
              );

INSERT INTO emp
VALUES ('1', 'PRESIDENT', 'gh', '10000', '1');
INSERT INTO emp
VALUES ('2', 'Bob', 'Slave', '6456', '3');
INSERT INTO emp
VALUES ('3', 'Matthew', 'M', '1', '1');
INSERT INTO emp
VALUES ('4', 'Marl', 'P', '534465', '2');
INSERT INTO emp
VALUES ('5', 'Apple', 'P', '554545646512', '2');
INSERT INTO emp
VALUES ('6', 'Roy', 'Slave', '125', '1');
INSERT INTO emp
VALUES ('7', 'Marth', 'Slave', '56456', '1');
INSERT INTO emp
VALUES ('8', 'Mart', 'Slave', '98', '3');

以下是我的查询:

SELECT * FROM emp;

SELECT * FROM emp 
  WHERE boss = (SELECT num FROM emp
              WHERE num = boss) AND num != boss;

SELECT e1.num,e1.name FROM emp e1
  WHERE
(SELECT e2.salary FROM emp e2 
  WHERE e2.boss = (SELECT e3.num FROM emp e3
                  WHERE e3.num = e3.boss) AND e2.num != e2.boss) < 98;  

因此第一个输出按预期打印出所有内容。第二个输出打印出来:Matthew,Roy和Marth如预期的那样。

但最终输出打印出一个。

这是我给出的练习测试题 我的目标是打印在总统领导下工作的每个人的数量和名称,这些人不到总人数的MIN。

我可以使用以下代码计算MIN:

SELECT min(salary) FROM emp 
            WHERE boss != (SELECT num FROM emp
                        WHERE num = boss);  

理想情况下,我想在上一个查询中使用此语句替换98,但我认为最好是将其分解并一次尝试一件事。

1 个答案:

答案 0 :(得分:1)

你的问题是太多的子查询。 e2完全独立于e1; e2子查询返回在总统下工作的所有工资;然后比较将返回第一个值。

您可以使用correlated subquerye2绑定到e1,但您根本不需要子查询:

SELECT e1.num,
       e1.name
FROM emp AS e1
WHERE e1.boss = (SELECT e3.num
                 FROM emp AS e3
                 WHERE e3.num = e3.boss)
  AND e1.num != e1.boss
  AND e1.salary < 98;