2013-05-14 91 views
0

我有2个表:如何选择ID在一个表中存在的行,但不是另一个表中的行?

1)一种顺序表(其具有OrderNumber作为ID)

2),它可以具有多个行的相关文件表,并且还具有一个OrderNumber列捆扎每一行中的ord呃上面排。

大多数订单在Items表中有多行 - 但有些不需要,我需要拉取Orders的报表而没有关联的Items行。

我可以在我的PHP的2个查询中做到这一点,但显然有更聪明的方法来在MySQL中做到这一点。我了解JOINS,但通常这是两个表中都有数据的时候。如果两者都没有联系,我该如何解决这个问题?

+0

您想要从订单表中获取记录,并且没有匹配项目表中的记录? – zamil 2013-05-14 11:26:38

回答

3

我会用一个LEFT OUTER JOIN或FULL OUTER JOIN,这取决于你所需要的..如果您发布的2个查询,或一些示例数据这将有助于...

OUTER处理该ISN任何数据“T有

这里是来帮助你的链接:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

+0

SELECT * 从订单 LEFT OUTER JOIN项目ON Order.OrderNumber = Items.OrderNumber – 2013-05-14 11:11:21

+0

感谢您的指导和片段。工作得很好,教给我的不仅仅是我通常在这里做的复制和粘贴(懒惰就是这样)。 – 2013-05-14 11:46:50

0

你可以使用该NOT IN短语where子句。这将会获得订单记录的ID不在Items表中。

SELECT * FROM Order WHERE Id NOT IN (SELECT OrderNumber FROM Items) 
+1

联接比子查询更快。数据库101. – 2013-05-14 11:38:40

+0

的确,但目标是获得哪些订单没有物品的结果集,而不是订单的记录和不是他们的物品的记录。逻辑101.一个左外连接将给你一个更大的数据集来处理,然后需要一个where条件剔除。有时候一个可读的解决方案更适合,尤其是对于SQL初学者。 – 2013-05-14 11:58:54

+0

您对“更大的数据集”的声明是错误的,因为输出与适当的WHERE限制相同。此外,子查询将最有可能转换为临时表,并为每个订单条目评估一次,并相信我会得到一个很大的数据集来提取信息。这更可读吗?真正。这是一个初学者的好建议吗?不。 – 2013-05-14 12:44:22

1

让我们假设你的Items表的主键是Items_Id

SELECT * FROM Orders LEFT JOIN Items USING (`OrderNumber`) where Items.Items_Id IS NULL 
1

除了上面列出的方式,我会说,我会使用这样的结构:

SELECT * FROM Order where not exists (SELECT NULL FROM Items where OrderNumber = Orders.OrderNumber); 

您还可以在项目的OrderNumber列中添加索引以获得更好的性能:

CREATE INDEX Idx_Items on Items (OrderNumber); 
+0

联接比子查询更快。数据库101. – 2013-05-14 11:39:05

+0

谢谢!创建索引查询是必不可少的,因为我的系统陷入困境。干杯! – 2013-05-14 11:47:55

+0

是的,连接速度更快,但首先并不总是,其次它们有时不可用(例如在动态sql中,例如当您需要添加一些动态过滤器时)。 – ZZa 2013-05-15 05:02:33

相关问题