1

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

    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

在 packet_details.packetDetailsId = sales.packetDetailsId 上的 INNER JOIN sales

在 sales.saleId = sold_products.saleId 内加入已售产品

4

2 回答 2

2

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

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


尖端

假设您的临时表是temp_result1and temp_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功能。

希望这可以帮助你

于 2013-03-11T19:47:56.470 回答
0

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

所以你的陈述应该是:

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

我的错。这仅适用于 MS SQL

于 2013-03-11T19:51:37.957 回答