我想自然加入3次(Product
是库存)然后将它们联合在一起,但以下不能使用错误near "(": syntax error: (
,我想看到所有匹配项目的model
和price
。
(SELECT model, price FROM PC) NATURAL JOIN (SELECT model FROM Product WHERE maker='B')
UNION
(SELECT model, price FROM Laptop) NATURAL JOIN (SELECT model FROM Product WHERE maker='B')
UNION
(SELECT model, price FROM Printer) NATURAL JOIN (SELECT model FROM Product WHERE maker='B');
有人可以帮忙吗?谢谢。
你可以写下你的查询,如下所示
select
model, price from (SELECT model, price FROM PC) a1 JOIN
(SELECT model FROM Product WHERE maker='B') a on a1.model=a.model
union
select model, price from
(SELECT model, price FROM Laptop) b1
JOIN (SELECT model FROM Product WHERE maker='B') b on b1.model =b.model
UNION
select model, price from
(SELECT model, price FROM Printer) c1 JOIN
(SELECT model FROM Product WHERE maker='B') c on c1.model=c.model
可能是你有太多()和缺少表别名
SELECT model, price
FROM PC
NATURAL JOIN ( SELECT model FROM Product WHERE maker='B') t1
UNION
SELECT model, price
FROM Laptot
NATURAL JOIN (SELECT model FROM Product WHERE maker='B') t2
UNION
SELECT model, price
FROM Printer
NATURAL JOIN (SELECT model FROM Product WHERE maker='B') t3;
如果你不是自然连接想要使用内连接,你可以看到表名alais用于正确识别与列相关的e:
SELECT model, price
FROM Printer
INNER JOIN (
SELECT model FROM Product WHERE maker='B'
) t3 on t3.model = printer.model ;
JOIN
(及其变体)是FROM
条款中的运算符。所以,你的查询根本没有意义。您正在使用SQL子句之外的运算符。
每个查询都可以写成:
select model, price
from (SELECT model, price FROM PC) p NATURAL JOIN
(SELECT model FROM Product WHERE maker ='B') b;
但是,我认为NATURAL JOIN
是一种憎恶,因为它按名称匹配列而不是显式外键关系。这种用法略好于大多数用法。代码明确地选择列,因此代码与“意外”列隔离逻辑。
但是,我认为这更简单明了:
select p.model, p.price
from pc p join
product pr
on p.model = pr.mode
where pr.maker = 'B';
而exists
可能更清楚:
select p.model, p.price
from pc p join
where exists (select 1
from product pr
where p.model = pr.model and pr.maker = 'B'
);
那三个表的联合然后是半决赛到第四个怎么样?:
WITH T AS ( SELECT model, price FROM PC
UNION
SELECT model, price FROM Laptop
UNION
SELECT model, price FROM Printer )
SELECT *
FROM T
WHERE model IN ( SELECT model FROM Product WHERE maker = 'B' );