SQL - UNION,UNION ALL,INTERSECT,EXCEPT

时间:2014-05-31 05:45:42

标签: sql

我正在使用GalaXQL学习SQL,并且无法弄清楚以下问题:

  

构建一个从行星返回starid的查询。应选择starid,以便列表中的每个starid(x):    - 应该存在一个星球的行星,它是三倍x但是    - 不应该有一个starid两次x的行星。   只使用行星表中的starid:s。

使用UNION,UNION ALL,INTERSECT,EXCEPT可以实现此目的的查询是什么? 因为我是初学者,请在你的答案中消化这个。 提前谢谢!

这是数据库架构:

CREATE TABLE stars (starid INTEGER PRIMARY KEY,
                    name TEXT,
                    x DOUBLE NOT NULL,
                    y DOUBLE NOT NULL,
                    z DOUBLE NOT NULL,
                    class INTEGER NOT NULL,
                    intensity DOUBLE NOT NULL);

CREATE TABLE hilight (starid INTEGER UNIQUE);

CREATE TABLE planets (planetid INTEGER PRIMARY KEY,
                      starid INTEGER NOT NULL,
                      orbitdistance DOUBLE NOT NULL,
                      name TEXT,
                      color INTEGER NOT NULL,
                      radius DOUBLE NOT NULL);

CREATE TABLE moons (moonid INTEGER PRIMARY KEY,
                    planetid INTEGER NOT NULL,
                    orbitdistance DOUBLE NOT NULL,
                    name TEXT,
                    color INTEGER NOT NULL,
                    radius DOUBLE NOT NULL);

CREATE INDEX planets_starid ON planets (starid);
CREATE INDEX moons_planetid ON moons (planetid);

这是我的问题:

SELECT planets.starid
FROM planets
UNION
SELECT starid*3 FROM planets
EXCEPT
SELECT starid*2 FROM planets

3 个答案:

答案 0 :(得分:2)

最简单的方法是从存在/不存在开始:

SELECT starid
FROM planets p1
WHERE EXISTS (
    SELECT 1 
    FROM planets p2
    WHERE p2.starid = 3*p1.starid
)
AND NOT EXISTS (
    SELECT 1 
    FROM planets p3
    WHERE p3.starid = 2*p1.starid
)

如果你想用联合/交叉来表达这一点,那么让A成为来自星球的所有星辰,并让B成为starids * 3.由于这两者都必须存在,我们正在谈论内容

SELECT starid
FROM planets
INTERSECT
SELECT 3*starid
FROM planets

从那个集合中我们想要排除starids * 2.这是除了starids之外的所有元素* 2.这被称为EXCEPT或MINUS:

SELECT starid
FROM planets
EXCEPT
SELECT 2*starid
FROM planets

由于结果应属于这两个集合,我们再次应用交集:

(SELECT starid
FROM planets
INTERSECT
SELECT 3*starid
FROM planets)
INTERSECT
(SELECT starid
FROM planets
EXCEPT
SELECT 2*starid
FROM planets)

这有帮助吗?

答案 1 :(得分:1)

nice explanation 有关详细信息,请查看链接 this help me

答案 2 :(得分:0)

请参阅以下所有运算符的示例查询。

注意:MINUS 运算符在 MS SQL Server 中不受支持。相当于 SQL Server 中的 EXCEPT 运算符。

SELECT name FROM Employee    /* Fetch the union of queries */
UNION
SELECT name FROM Contacts;

SELECT name FROM Employee    /* Fetch the union of queries with duplicates*/
UNION ALL
SELECT name FROM Contacts;

SELECT name FROM Employee    /* Fetch names from Employee */
EXCEPT                       /* that aren't present in contacts */
SELECT name FROM Contacts;

SELECT name FROM Employee    /* Fetch names from Employee */
INTERSECT                    /* that are present in contacts as well */
SELECT name FROM Contacts;