sql执行3自然连接然后联合然后在一起

问题描述 投票:-1回答:4

我想自然加入3次(Product是库存)然后将它们联合在一起,但以下不能使用错误near "(": syntax error: (,我想看到所有匹配项目的modelprice

    (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');

有人可以帮忙吗?谢谢。

sql syntax
4个回答
0
投票

你可以写下你的查询,如下所示

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

0
投票

可能是你有太多()和缺少表别名

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 ;

0
投票

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'
             );

0
投票

那三个表的联合然后是半决赛到第四个怎么样?:

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' );
© www.soinside.com 2019 - 2024. All rights reserved.