【问题标题】:Unique Select Query into Table Sqlite3唯一选择查询到表 Sqlite3
【发布时间】:2015-07-30 17:34:53
【问题描述】:

我有以下数据库结构

Table 1
EventID  |  Person1  |  Person2  | Person3  |  ...  | PersonN

Table 2
Person  |  Height  |  Weight

现在我想要一个查询,对于给定的EventID(这是唯一的)返回相关人员及其HeightWeight

我正在考虑按照以下方式创建某种临时表

CREATE TEMP TABLE t AS
SELECT Person1, Person2, Person3, ..., PersonN FROM Table1 WHERE EVENTID = ?

然后将临时表ttable2 连接起来,但这当然行不通,因为我想要的是t 的转置。

我该怎么做呢?

【问题讨论】:

  • 考虑将Table1 标准化为EventID | PersonIndex (if even needed) | Person
  • 同意,不确定这是否会是一个新问题,但我该怎么做呢?
  • 您可以为每个人插入一行EventID, Person,而不是插入一行EventID, P1, P2, P3, ...(这很难查询并限制与事件相关的人数)。然后查询变得微不足道:SELECT Table2.* FROM Table1 INNER JOIN Table2 ON Table1.Person = Table2.Person WHERE Table1.EventID = ?
  • 对,我的意思是有没有一种很好的方法来规范化我的表,使用 SQL(不是在插入阶段)?
  • INSERT INTO NewTable SELECT EventID, Person1 FROM OldTable WHERE Person1 IS NOT NULL UNION ALL SELECT EventID, Person2 FROM OldTable WHERE Person2 IS NOT NULL UNION ALL ... 不漂亮,但你只需要做一次。

标签: sql join sqlite


【解决方案1】:

如果给你事件ID,你可以使用exists:

select t2.*
from table2 t2
where exists (select 1
              from table1 t1
              where t2.person in (t1.person1, t1.person2, t1.person3) and
                    t1.eventid = $eventid
             );

但是,您的数据结构不太适合缩放目的。问题数据结构将有一个EventPersons 表,其中EventId 一列,PersonId 一列。

【讨论】:

  • 我编辑了问题以强调需要一个通用的解决方案
  • @rwolst 。 . .一个表的列数是固定的,因此只需将所有列都放在in 列表中。当然,你的桌子近乎荒谬。构建数据的正确方法是使用联结表,每个事件和每个人一行。
【解决方案2】:
 select t2.person, t2.height, t2.weight
from table2 t2
join
(select person1 as person,event_id as person from table1 
 union select person2,event_id from table1..
 select personN,event_id from table1) t3
on t3.person = t2.person
where t3.event_id = ?

这是我能想到的更通用的方法。但正如 cmets 所说,您应该考虑更改表结构。

【讨论】:

  • 我编辑了问题以强调需要一个通用的解决方案
  • 已修改但不确定是否是最佳方法
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2020-12-12
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
相关资源
最近更新 更多