2011-01-06 57 views
0

好吧我有一个135000行的临时表,我试图从这个临时表中插入一些值到其他表中。选择一个不同的列,其他可能不明显。 - MySQL

这是我使用

tvtemptable

+-------------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+-------------+-------------+------+-----+---------+-------+ 
| PROGTITLE | text  | YES |  | NULL |  | 
| SUBTITLE | text  | YES |  | NULL |  | 
| EPISODE  | text  | YES |  | NULL |  | 
| YR   | year(4)  | YES |  | NULL |  | 
| DIRECTOR | text  | YES |  | NULL |  | 
| PERFORMERS | text  | YES |  | NULL |  | 
| PREMIERE | tinyint(1) | YES |  | NULL |  | 
| FILM  | tinyint(1) | YES |  | NULL |  | 
| RPEAT  | tinyint(1) | YES |  | NULL |  | 
| SUBTITLES | tinyint(1) | YES |  | NULL |  | 
| WIDESCREEN | tinyint(1) | YES |  | NULL |  | 
| NEWSERIES | tinyint(1) | YES |  | NULL |  | 
| DEAFSIGNED | tinyint(1) | YES |  | NULL |  | 
| BNW   | tinyint(1) | YES |  | NULL |  | 
| STARRATING | tinyint(4) | YES |  | NULL |  | 
| CERTIFICATE | varchar(5) | YES |  | NULL |  | 
| GENRE  | varchar(50) | YES |  | NULL |  | 
| DESCRIPTION | text  | YES |  | NULL |  | 
| CHOICE  | tinyint(1) | YES |  | NULL |  | 
| PROGDATE | date  | YES |  | NULL |  | 
| STARTIME | time  | YES |  | NULL |  | 
| ENDTIME  | time  | YES |  | NULL |  | 
| DURATION | int(11)  | YES |  | NULL |  | 
| CHANNELID | int(11)  | NO |  | NULL |  | 
+-------------+-------------+------+-----+---------+-------+ 

渠道

+-------------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-------------+-------------+------+-----+---------+----------------+ 
| CHANNELID | int(11)  | NO | PRI | NULL | auto_increment | 
| CHANNELNAME | varchar(50) | YES |  | NULL |    | 
+-------------+-------------+------+-----+---------+----------------+ 

流派

+-----------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-----------+-------------+------+-----+---------+----------------+ 
| GENREID | int(11)  | NO | PRI | NULL | auto_increment | 
| GENRENAME | varchar(50) | YES |  | NULL |    | 
+-----------+-------------+------+-----+---------+----------------+ 

程序

模式
+-------------+------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-------------+------------+------+-----+---------+----------------+ 
| PROGRAMMEID | int(11) | NO | PRI | NULL | auto_increment | 
| GENREID  | int(11) | NO | MUL | NULL |    | 
| PROGTITLE | text  | YES |  | NULL |    | 
| YR   | year(4) | YES |  | NULL |    | 
| DIRECTOR | text  | YES |  | NULL |    | 
| PERFORMERS | text  | YES |  | NULL |    | 
| FILM  | tinyint(1) | YES |  | NULL |    | 
| WIDESCREEN | tinyint(1) | YES |  | NULL |    | 
| BNW   | tinyint(1) | YES |  | NULL |    | 
| CERTIFICATE | varchar(5) | YES |  | NULL |    | 
| DESCRIPTION | text  | YES |  | NULL |    | 
+-------------+------------+------+-----+---------+----------------+ 

插曲

+-------------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+-------------+---------+------+-----+---------+----------------+ 
| EPISODEID | int(11) | NO | PRI | NULL | auto_increment | 
| PROGRAMMEID | int(11) | NO | MUL | NULL |    | 
| SUBTITLE | text | YES |  | NULL |    | 
| EPISODE  | text | YES |  | NULL |    | 
| DIRECTOR | text | YES |  | NULL |    | 
| PERFORMERS | text | YES |  | NULL |    | 
| DESCRIPTION | text | YES |  | NULL |    | 
+-------------+---------+------+-----+---------+----------------+ 

channelprogramme

+--------------------+------------+------+-----+---------+----------------+ 
| Field    | Type  | Null | Key | Default | Extra   | 
+--------------------+------------+------+-----+---------+----------------+ 
| CHANNELPROGRAMMEID | int(11) | NO | PRI | NULL | auto_increment | 
| CHANNELID   | int(11) | NO | MUL | NULL |    | 
| PROGRAMMEID  | int(11) | NO | MUL | NULL |    | 
| EPISODEID   | int(11) | NO | MUL | NULL |    | 
| RPEAT    | tinyint(1) | YES |  | NULL |    | 
| NEWSERIES   | tinyint(1) | YES |  | NULL |    | 
| PREMIERE   | tinyint(1) | YES |  | NULL |    | 
| CHOICE    | tinyint(1) | YES |  | NULL |    | 
| SUBTITLES   | tinyint(1) | YES |  | NULL |    | 
| DEAFSIGNED   | tinyint(1) | YES |  | NULL |    | 
| STARRATING   | tinyint(4) | YES |  | NULL |    | 
| PROGDATE   | date  | YES |  | NULL |    | 
| STARTTIME   | time  | YES |  | NULL |    | 
| ENDTIME   | time  | YES |  | NULL |    | 
| DURATION   | tinyint(4) | YES |  | NULL |    | 
+--------------------+------------+------+-----+---------+----------------+ 

所以背景的一点点,数据库是一个电视节目表数据库中,channelprogramme表为每个通道上的每场演出的所有条目,节目表包含每个节目的唯一条目,节目包含具有节目的每集节目的唯一条目

我想我的困惑是我想从临时表中选择不同的编码来填充程序表,但我想要一些其他信息。

例如,如果我没有

select distinct(progtitle) from tvtemptable; 

它只会返回我的价值,为progtitle列,而我真正想要的是progtitle加上一些其他的东西。

所以,如果我尝试选择更多像这样

mysql> select distinct progtitle, yr, director, film from tvtemptable 
limit 30; 
+-----------------------------------+------+---------------------+------+ 
| progtitle       | yr | director   | film | 
+-----------------------------------+------+---------------------+------+ 
| Teleshopping      | 2000 |      | 0 | 
| Cinemania       | 2000 |      | 0 | 
| Whose Line Is It Anyway?   | 2000 |      | 0 | 
| Just Desserts      | 2004 | Kevin Connor  | 1 | 
| Law & Order      | 2000 | Matthew Penn  | 0 | 
| Jane Doe: Yes, I Remember it Well | 2006 | Armand Mastroianni | 0 | 
| CSI: NY       | 2000 | David Jackson  | 0 | 
| CSI: Crime Scene Investigation | 2000 | Kenneth Fink  | 0 | 
| NCIS        | 2000 | Colin Bucksey  | 0 | 
| CSI: Miami      | 2000 |      | 0 | 
| Enter the Dragon     | 1973 | Robert Clouse  | 1 | 
| Close        | 2000 |      | 0 | 
| My Son Is Innocent    | 1996 | Larry Elikann  | 1 | 
| Law & Order      | 2000 | Christopher Misiano | 0 | 
| Murder 101      | 2006 | Christian I Nyby II | 1 | 
| CSI: NY       | 2000 | Christine Moore  | 0 | 
| CSI: Crime Scene Investigation | 2000 | Bill Eagles   | 0 | 
| Rush Hour       | 1998 | Brett Ratner  | 1 | 
| Dark Blue       | 2000 | Jeffrey Hunt  | 0 | 
| CSI: Crime Scene Investigation | 2000 | Richard J Lewis  | 0 | 
| Ordinary Miracles     | 2005 | Michael Switzer  | 1 | 
| Law & Order      | 2000 | Jace Alexander  | 0 | 
| Wounded Heart      | 1995 | Vic Sarin   | 1 | 
| CSI: NY       | 2000 | Jonathan Glassner | 0 | 
| Dark Blue       | 2000 | Nathan Hope   | 0 | 
| Blade: The Series     | 2000 | Michael Robison  | 0 | 
| K-Ville       | 2000 | Kevin Dowling  | 0 | 
| Law & Order      | 2000 | Jim Ellis   | 0 | 
| Reasons of the Heart    | 1996 | Rick Jacobson  | 1 | 
| CSI: NY       | 2000 | Anthony Hemingway | 0 | 
+-----------------------------------+------+---------------------+------+ 

会有在progtitle列几个重复的信息。对于每位新导演都不重复这些节目,对于某些节目,上面有不同的导演,因为这些节目有剧集。

现在我已经设法选择正常工作。如果我只需要例如一个额外的列

select distinct 
    t1.progtitle, 
    (select 
     t2.director 
    from 
     tvtemptable t2 
    where 
     t1.progtitle = t2.progtitle 
    limit 1) as "Director" 
from 
    tvtemptable t1 limit 10; 

+-----------------------------------+--------------------+ 
| progtitle       | Director   | 
+-----------------------------------+--------------------+ 
| Teleshopping      |     | 
| Cinemania       |     | 
| Whose Line Is It Anyway?   |     | 
| Just Desserts      | Kevin Connor  | 
| Law & Order      | Matthew Penn  | 
| Jane Doe: Yes, I Remember it Well | Armand Mastroianni | 
| CSI: NY       | David Jackson  | 
| CSI: Crime Scene Investigation | Kenneth Fink  | 
| NCIS        | Colin Bucksey  | 
| CSI: Miami      |     | 
+-----------------------------------+--------------------+ 

很显然,如果我要选择不止一个附加列

更多,这将导致混乱

那么最好的办法是什么?

这是我从临时表中填充程序表的插入命令,目前它与上面给出的选择示例中的重复项具有相同的问题。

INSERT INTO PROGRAMME (
    PROGTITLE, GENREID, YR, DIRECTOR, 
    PERFORMERS, FILM, WIDESCREEN, BNW, 
    CERTIFICATE, DESCRIPTION) 
SELECT DISTINCT 
    T.PROGTITLE, G.GENREID, T.YR, T.DIRECTOR, 
    T.PERFORMERS, T.FILM, T.WIDESCREEN, T.BNW, 
    T.CERTIFICATE, T.DESCRIPTION 
FROM 
    TVTEMPTABLE T 
    INNER JOIN GENRE G ON G.GENRENAME=T.GENRE 
    LEFT JOIN PROGRAMME P ON P.PROGTITLE=T.PROGTITLE 
WHERE 
    P.PROGTITLE IS NULL 
+1

呃,这样一个简单的问题怎么会变成四页?这很可怕。 – 2011-01-06 19:40:12

回答

0

我是否有权假定您的TVTEMPTABLE是来自某个地方的表格连接的结果?

如果是这种情况,我认为如果您首先将该临时表分成多个与目标表具有相同格式的临时表,那么总体工作就会更简单。

例如(我不知道你的数据,所以我只是猜测):

-- All genres (matches your existing genres table) 
create table genres_temp as 
    select distinct genre 
    from tvtemptable; 

-- All programmes (matches your existing programme table) 
create table programmes_temp as 
    select distinct all_the_programme_columns 
    from tvtemptable; 

-- Contains the many-to-many relationship between genres and programmes 
create table programme_genre_temp as 
    select distinct genre, progtitle 
    from tvtemptable; 

以上不回答你的问题,但它可能给你一些想法,带走的问题,这似乎是程序信息重复每个东西。你需要找出它是什么。

更新 因此,每个导演都重复一次每个节目? 然后我的上述方法更有意义:首先提取实体和关系。

更新2 嗯,当导演与该剧集有关时,你是否适合导演进入节目?这似乎是一个模型错误。无论如何,如果您不关心您选择哪个导演,则可以将其分组在progtitle之间,并在所有其他列中使用MAX()。这将给你不同的编码和其余列的值之一。

SELECT T.PROGTITLE, max(G.GENREID), max(T.YR), max(T.DIRECTOR), etc 
    FROM TVTEMPTABLE T 
INNER JOIN GENRE G ON G.GENRENAME=T.GENRE 
     LEFT JOIN PROGRAMME P ON P.PROGTITLE=T.PROGTITLE 
WHERE P.PROGTITLE IS NULL 
group by T.PROGTITLE; 
0

这没有意义。一排如何可以部分不同和部分不明显?将所选结果视为表格 - 如果PROGTITLE中有一个值为其他列的多个值,那么您将如何表示数据?

+0

谢谢,我已编辑原始帖子,进一步澄清 – PDStat 2011-01-06 11:04:26

+0

轻松:数据库选择一个并放弃其余。 – 2011-01-06 11:06:02

+0

(这应该是一个评论,而不是答案。) – 2011-01-06 11:06:18

0

这不回答你的问题,但可能会回答这些人在这里谷歌上搜索自己的方式:

在PostgreSQL,你可以做到这一点与SELECT DISTINCT ON,如:

SELECT DISTINCT ON (p.progtitle) p.* FROM progtitle p; 

我不知道MySQL的任何等价物。

0
Insert into xx (a,b) 
Select a.ab, b.bb from (
Select distinct ab from a) a, (select distinct bb from b) b 
0

我在读,你想要的是一个不同的程序列表,但与上下文的其他列中的一些关联的数据?你可以用行号来做到这一点。

select * from 
(select *, 
     row_number() over (partition by progtitle order by year desc) N 
    from tvtempta) t 
where t.N = 1 

更妙的是,你可以使用order by子句指定最近的,第一,或一些其它优选选择你想要哪一行的方式。这是T-SQL语法,我认为相同的语法应该可以在Oracle中使用(如果不是的话,它在Oracle中绝对可行)。不幸的是,我不知道你是否可以在MySQL中做到这一点。