【问题标题】:Mysql, combining and querying results with sub queries or temp tablesMysql,结合子查询或临时表查询结果
【发布时间】:2013-02-27 03:19:03
【问题描述】:

在以下情况下我遇到了一些麻烦: 我有一个创建两个临时表的查询,然后选择将它们连接在一起--

    SELECT * FROM result 
    INNER JOIN result2 ON result2.packetDetailsId = result.packetDetailsId

然后我尝试通过连接一些结果字段来创建另一列,然后使用它来引用/查询另一个表。有没有办法在一个查询中完成这个?我应该离开临时表吗?

再次感谢您。


更新:如果我尝试为两个临时表的组合设置别名,我会收到一条错误消息,指出 [Err] 1060 - Duplicate column name 'packetDetailsId'

    select * from (
    SELECT * FROM result 
    INNER JOIN result2 ON result2.packetDetailsId = result.packetDetailsId) as myalias

另一个更新:我几乎让它作为一个查询工作,但我在我连接的列中得到结果“(BLOB)”:

       select packet_details.packetDetailsId,products.productId,Credit,AccountNum,OrderStat,          CONCAT(products.productId,Credit,'_',OrderStat) as consol from (
    select packetDetailsId, GROUP_CONCAT(Credit) AS Credit, GROUP_CONCAT(AccountNum) AS AccountNum, GROUP_CONCAT(OrderStat) AS OrderStat FROM
 ( SELECT pd_extrafields.packetDetailsId,
CASE WHEN pd_extrafields.ex_title LIKE ('%Credit%') 
THEN pd_extrafields.ex_value ELSE NULL END as Credit,
CASE WHEN pd_extrafields.ex_title LIKE ('%Account%') 
THEN pd_extrafields.ex_value ELSE NULL END as AccountNum,
CASE WHEN pd_extrafields.ex_title LIKE ('%Existing%') 
THEN pd_extrafields.ex_value ELSE NULL END as OrderStat
FROM pd_extrafields  )AS TempTab GROUP BY packetDetailsId ) as alias2

    INNER JOIN packet_details ON alias2.packetDetailsId = packet_details.packetDetailsId

INNER JOIN sales ON packet_details.packetDetailsId = sales.packetDetailsId

在 sales.saleId = sold_products.saleId 上的 INNER JOIN sold_products INNER JOIN products ON sold_products.productId = products.productId

【问题讨论】:

  • 您可以在单个查询中完成,但是您对使用临时表有什么顾虑?这通常可以使复杂的查询更容易理解,甚至更有效地运行,因为它更容易让引擎理解并创建更好的执行计划。
  • 你在哪里连接字段?在临时表的join查询中?
  • 是的,Michael 使用临时表让生活变得更轻松。 Ravindra,我实际上是在组合两个查询(其中一个是您前几天帮助的),然后是另一个查询提取其他相关信息。当我组合这两个临时表时,它来自我想要连接字段的结果表。这有意义吗?

标签: mysql subquery temp-tables


【解决方案1】:

如果我理解正确,您已经创建了临时表,您需要使用from ... inner join ...“连接”结果

您可能遇到的唯一限制是您只能在from 子句中引用您的临时表一次;除此之外,没有其他限制(我经常使用临时表作为创建最终结果的中间步骤)。


提示

假设您的临时表是temp_result1temp_result2。两个表都有一个字段packedDetailsId,将在该字段上执行连接。请记住在每个表上创建适当的索引;至少你需要在两个表上索引packedDetailsId

alter table temp_result1
    add index PDI(packedDetailsId);
alter table temp_result2
    add index PDI(packedDetailsId);

现在,只需使用所需的连接和连接执行查询。如果concat 返回BLOB,则将结果转换为char(当然,我假设您需要一个文本字符串):

select r1.*, r2.*, cast(concat(r1.field1, ',', r2.field2) as char) as data_concat
from temp_result1 as r1
    inner join temp_result2 as r2 on r1.packedDetailsId = r2.packedDetailsId;

我看到你的问题是 GROUP_CONCAT 正在返回 BLOB 值...这很正常(MySQL 不知道先验如何返回值,所以它返回二进制数据) ;只需使用cast 函数即可。

希望对你有帮助

【讨论】:

  • 谢谢 Barranka,我实际上是在尝试连接两个临时表的结果表中的结果。
  • @alex 那么你不应该有任何问题......这就是临时表的用途
  • Barranka,有什么技巧可以成功做到这一点吗?
  • Barranka,我很高兴能尝试一下,是的,我对 BLOB 结果感到很疯狂,谢谢你澄清这个问题!
  • Barranka,再次感谢你,cast() 帮助了 BLOB 结果,非常感谢,保重
【解决方案2】:

因此,如果 result2 和 result 都是临时表,则必须包含 # if local temp table 和 ## if global temp table

所以你的陈述应该是:

SELECT * FROM #result 
INNER JOIN #result2 ON #result2.packetDetailsId = #result.packetDetailsId

我的坏。这仅适用于 MS SQL

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多