sql执行3个自然连接,然后联合,然后合并

sql执行3个自然连接,然后联合,然后合并,sql,syntax,Sql,Syntax,我想自然地加入3次(产品是库存),然后将它们合并在一起,但以下内容不适用于错误near”(“:语法错误:(),我想查看所有匹配项的模型和价格 (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 Produc

我想自然地加入3次(
产品
是库存),然后将它们合并在一起,但以下内容不适用于错误
near”(“:语法错误:(
),我想查看所有匹配项的
模型
价格

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

您可以像下面这样编写查询

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
JOIN
(及其变体)是
FROM
子句中的运算符。因此,您的查询根本没有意义。您在SQL子句之外的有意义的地方使用运算符

每个查询可以写成:

select model, price
from (SELECT model, price FROM PC) p NATURAL JOIN
     (SELECT model FROM Product WHERE maker ='B') b;
<>但是,我认为<代码>自然连接< /代码>是一种憎恶,因为它通过名称而不是显式的外键关系来匹配列。这个用法比大多数用法稍微好一些。代码明确地选择了列,因此代码与“意外”列隔离,使逻辑混乱。

但是,我认为这更简单、更清楚:

select p.model, p.price
from pc p join
     product pr
     on p.model = pr.mode
where pr.maker = 'B';
存在
可能更清楚:

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

这是什么SQL技术?你说的是JOIN,但你在加入什么?是表名..你在使用一个JOIN,而一个JOIN需要一个表名..所以t1,t2.t3是基于你选择的JOIN的表名..还有一个问题我的代码在回答中起作用了吗???所以在当前会话中,我可以像va一样使用这些表变量?您可以使用作为连接的表别名,以获取完整的表。列名..是(不是变量,而是别名)无论如何,答案更新为引用表别名的内部联接的示例。我的意思是,不要将这么多的并集和联接组合在一起,我可以将其存储到
t1
中,并对第二个联接和第三个联接执行相同的操作吗?最后,我对
t1
t2
t3
执行并集,就像将表存储到这些表中一样“临时”表感谢。这使得<代码>自然连接< /代码>进入正常<代码>连接到一个条件< /代码>?“我认为自然加入一个憎恶,因为它通过名称而不是明确的外键关系来匹配列”-有点像说:“我讨厌苹果,因为它们不在橘子树上生长。”“同样,数据库修改语言中的运算符与数据库/按设计/中的约束无关。