2013-08-06 27 views
0

考虑到我仍在学习编写查询并且无法查看,这可能有点难以回答目前的数据库,但我会给它一个镜头。MySQL查询:当另一列中的值与特定条件相匹配时,返回一列中具有特定值的所有行

我试图从中获取信息的数据库包含一个基本上充当商店事务日志的大型表(TransactionLineItems)。该表当前包含大约500万行和几列描述每个事务中包含的产品(TLI_ReceiptAlias,TLI_ScanCode,TLI_Quantity和TLI_UnitPrice)。此表具有与另一个表(Transactions)中的主键配对的外键,并且此表包含事务编号(TRN_ReceiptNumber)。当我加入这两个表时,查询会为我们销售的每件商品返回一行,并且每行都有一个收据编号。 16行可能具有相同的收据编号,这意味着所有这些项目都是在单个交易中出售的。在下面可能会多出12行,每行共享另一个收据编号。所有的交易都像这样分解成多行。

我在尝试构建一个查询,该查询返回共享单个收据号的所有行,其中至少一行包含该收据编号符合另一列中的特定条件。例如,三种不同类型的礼品卡都在TLI_ScanCode列中具有以“740000”开头的值。我希望查询返回TLI_ScanCode列中以这六位数字开头的值的行,但我还想返回与满足给定扫描代码条件的任何行共享收据编号的所有行。基本上,我需要查询返回每个收据编号的所有行,该编号至少与行号中的礼品卡相关的扫描代码配对。

我试图使用子查询返回与礼品卡的扫描码的对所有收到一列数字,使用“WHERE A.TRN_ReceiptAlias IN(子查询 ...”只返回一个收据号的那些行这与子查询返回的一个收据号码相匹配,这似乎在服务器处理查询时停止了另一个20分钟之前运行了五分钟,查询似乎成功完成,但鉴于我正在处理IT在这段时间恢复正常的店铺运营,我没有获得查询结果(除了相关的耻辱和尴尬)。 ain这个信息,而不会导致服务器挂起。我假设:a)在这样一个大表上使用子查询不是很聪明,或者b)我不太了解SQL以获取我需要的信息。我假设答案是A和B,但我非常想学习如何以正确的方式做到这一点。任何帮助将不胜感激。谢谢!

+0

显示您的查询和表关系 – zxc

+0

使用JOIN。 MySQL在优化'IN(子查询)'方面非常糟糕,但只要你有合适的索引,它的连接就会非常好。 – Barmar

+0

我不知道这个问题是否可以更简洁。 – Strawberry

回答

0
​​

包括上(b.id,b.some_criteria)

0

索引你是不是第一个,也不是你将是最后打倒你的系统低效的查询。

最重要的一点是,“决策支持”和“分析”实际上并不与交易系统共存。您真的想将数据提取到数据集市,数据仓库或其他非数据库的数据库中,这样您就不会脱机业务。

在理解您的初始查询效率如此低下的原因方面,您需要熟悉EXPLAIN EXTENDED语法,该语法返回计划信息,该信息应该有助于调试查询并使其可接受地工作。如果您使用实际的解释计划输出更新您的问题,这对确定问题是什么会有帮助。

只是从你提供的轮廓来看,它听起来像一个自我连接会有意义而不是子查询。

相关问题