【问题标题】:build table from select/union从选择/联合构建表
【发布时间】:2019-09-22 15:04:20
【问题描述】:

我有一个从 csv 文件构建的关系表,其中包含每行上的外部键。

表结构:

| id | tree/nome | tree/regioni/0 | .... | tree/regioni/n     

“n”等于36!!! 我已经从“SELECT/DINSTICT”构建了一个表“regions”,并在其上添加了一个 id;

现在我需要构建另一个表来提取“外部键”“tree/regioni/n”以及每行的“id”。

我发现实现这一点的不明智的方法是从每个“树/区域/n”的 SELECT/UNION 构建表:

SELECT `id`,`tree/regioni/0`
FROM `trees` WHERE 1 
UNION 
SELECT `id`,`tree/regioni/1`
FROM `trees` WHERE 1  
[.....]
UNION 
SELECT `id`,`tree/regioni/N`
FROM `trees` 
WHERE 1

【问题讨论】:

  • 在我的脑海中,你可能没有在这里使用最佳的桌子设计。如果 n 值在单个列中,但分布在不同的记录中,您可以使用简单的 WHERE 子句进行限制。
  • 是的,这是在 mysql 中执行 unpivot 操作的标准方法。联合查询有什么问题?

标签: mysql sql select union


【解决方案1】:

你的方法很好。如果trees 是一个视图,那么您将遇到多次评估该视图的问题。即使有一张表,您也必须多次扫描该表。

假设您没有要删除的重复项,请将 union 更改为 union all。您也可以使用cross join

select t.id,
       (case when n = 1 then `tree/regioni/0`
             when n = 2 then `tree/regioni/1`
             . . .
        end)
from t cross join
     (select 0 as n union all
      select 1 as n union all
      . . .
     ) x;

这看起来更复杂,但它只扫描/评估表表达式一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多