2013-08-06 24 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語法,該語法返回計劃信息,該信息應該有助於調試查詢並使其可接受地工作。如果您使用實際的解釋計劃輸出更新您的問題,這對確定問題是什麼會有幫助。

只是從你提供的輪廓來看,它聽起來像一個自我連接會有意義而不是子查詢。

相關問題