[英]More efficient way to write this SQL query
我有三个关系(简化了问题)
SUPPLIER(SNO)
PART(PNO, PNAME)
SHIPMENT(SNO, PNO)
其中SNO
和PNO
是与SUPPLIER
和PART
的主键匹配的外键
我写了一个查询来查找发给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.