我正在使用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
答案 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)
有关详细信息,请查看链接 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;