繁体   English   中英

编写此SQL查询的更有效方法

[英]More efficient way to write this SQL query

我有三个关系(简化了问题)

SUPPLIER(SNO)
PART(PNO, PNAME)
SHIPMENT(SNO, PNO)

其中SNOPNO是与SUPPLIERPART的主键匹配的外键

我写了一个查询来查找发给P2和P4的所有供应商的SNO 查询有效,但效率低下。 我排除了所有不是P2或P4的PNO

SELECT SUPPLIER.SNO, PNO
FROM SUPPLIER
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO
WHERE PNO <> 'P1' AND PNO <> 'P3' AND PNO <> 'P5' AND PNO <> 'P6'

必须有更好的方法来编写此查询。 我正在使用mssql-server

编辑:我只是在学习sql,并且不知道IN运算符。 谢谢您的帮助

如果任务是查找带有“ P2”或“ P4”的PNO的记录,则应选择这些而不是查看表,请注意只有“ P1”到“ P6”之间的值,并排除了这些值。 一旦有人添加了“ P7”记录,您的查询将会失败,因为它不仅会获取“ P2”和“ P4”的记录,还会获取“ P7”的记录。

适当的WHERE子句是

WHERE PNO = 'P2' OR PNO = 'P4'

或如已显示

WHERE PNO IN ('P2','P4')

处理来自多个表的数据时,应始终对列进行限定,即使用SHIPMENT.PNO而不是仅PNO

然后,最好使用表别名,以缩短查询时间。 为了提高可读性,您不应该大写字母。

SELECT supp.sno, ship.pno
FROM supplier supp
JOIN shipment ship ON supp.sno = ship.sno
WHERE ship.pno IN ('P1','P4');

还有一件事:由于运输表包含您的结果应显示的所有值,因此您当然不需要查询中的供应商表。

SELECT sno, pno
FROM shipment
WHERE pno IN ('P1','P4');

如果表中包含重复项,则可能需要使用SELECT DISTINCT sno, pno而不是SELECT DISTINCT sno, pno选择不同的行。

你可以用一个不

SELECT SUPPLIER.SNO, PNO
FROM SUPPLIER
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO
WHERE PNO not in ('P1' , 'P3' ,'P5' , 'P6')


你好
您可以使用下面的查询来提高效率,

SELECT SUPPLIER.SNO, PNO
FROM SUPPLIER
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO
WHERE PNO not in ('P1', 'P3', 'P5', 'P6');

您可以不使用。

Where PNO not in ('P1', 'P3', 'P5', 'P6')

也许甚至很简单

where PNO in ('P2', 'P4')

您可以尝试IN子句

SELECT SUPPLIER.SNO, PNO
FROM SUPPLIER
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO
WHERE PNO IN ('P2','P4')
SELECT SUPPLIER.SNO, PNO
FROM SUPPLIER
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO
WHERE PNO IN ('P2','P4')

为什么不简单

SELECT SUPPLIER.SNO, PNO
FROM SUPPLIER
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO
WHERE PNO  in 'P2, P4' 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM