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

时间:2016-09-28 17:42:15

标签: sql sql-server join

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

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运算符。谢谢你的帮助

7 个答案:

答案 0 :(得分:2)

如果任务是找到PNO的记录,那么&#39; P2&#39;或者&#39; P4&#39;,你应该选择这些而不是查看表格,看看只有来自&#39; P1&#39;到&#39; P6&#39;,并排除这些。一旦有人添加了一个“P7”&#39;记录,您的查询将失败,因为它不会只获得&#39; P2&#39;和&#39; P4&#39;,也适用于&#39; P7&#39;。

适当的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的不同行。

答案 1 :(得分:1)

你可以使用not in

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

答案 2 :(得分:1)

嗨,您可以使用以下查询来提高效率,

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

答案 3 :(得分:1)

你可以不用。

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

或者甚至可能是简单的

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

答案 4 :(得分:1)

您可以尝试IN子句

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

为什么不简单

pr