我有三个关系(简化问题)
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运算符。谢谢你的帮助答案 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