我有以下三个表:
Product(manufacturer,model,type)
Laptop(model,speed,ram,hd,price)
Printer (model,color,type,price)
如您所见,产品表包含制造商的名称以及他们制造的产品的型号。 type属性只指定是打印机还是笔记本电脑。现在让我们说作为用户我想找到制造商'A'制作的所有产品(包括笔记本电脑和打印机),输出应该是一个表。使用SQL语句。
我感到困惑的是如何组合两个具有不同属性和列大小的表。截至目前,我刚刚找到了制造商'A'的笔记本电脑和PC机型:
SELECT * from Product P , Laptop L where P.model = L.model
SELECT * from Product P, Printer PR where P.model = PR.model
请注意,这是两个单独的查询。我只是不知道如何将它们结合起来。尝试UNION
,但没有帮助
编辑:问题表明我需要打印型号,产品类型以及适合该类型的任何关系的所有属性。
你可以使用EXISTS
和UNION ALL
:
SELECT p.manufacturer, p.model, p.type
FROM product p
WHERE p.manufacturer = 'A' AND
EXISTS (SELECT 1 FROM laptop l WHERE l.model = p.model)
UNION ALL -- USE "UNION" IN ORDER TO REMOVE DUPLICATE ROW
SELECT p.manufacturer, p.model, p.type
FROM product p
WHERE p.manufacturer = 'A' AND
EXISTS (SELECT 1 FROM Printer pr WHERE pr.model = p.model);
使用左连接
select p.*,l.*,pr.* from Product p left join Laptop l on p.model=l.model
left join printer pr on pr.model=p.model
您可以使用INNER JOIN
子句然后给出您的连接条件和之后的where
条件。我希望它对你有用。
看起来你可以做到:
select p.*
from product p
where p.manufacturer = 'A' and
(exists (select 1
from laptop l
where l.model = p.model and l.type = 'laptop'
) or
exists (select 1
from printer pr
where pr.model = p.model and pr.type = 'printer'
)
);
但是,您似乎可以这样做:
select p.*
from product p
where p.type in ('laptop', 'printer');
如果你想引入其他属性,请像这样使用union all
:
select p.*, lp.*
from product p join
((select model, type, price
from laptop
) union all
(select model, type, price
from printer
)
) lp
on lp.model = p.model and lp.type = p.type;