2011-01-06 10 views
0

私は135000行の一時テーブルを持っていますが、私はこの一時テーブルからいくつかの値を他のテーブルに挿入しようとしています。1つの異なる列を選択します。他の列は区別できません。 -

これは私が

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テーブルは、すべてのチャネル上のすべてのショーのためのすべてのエントリが含まれています番組テーブルはすべての番組に固有のエントリを含み、エピソードはエピソードを有する番組の各エピソードの一意のエントリを含む

私は私の混乱は、プログラムテーブルを作成する一時テーブルから別のprogtitlesを選択したいと思うが、私はそれと一緒に行くいくつかの他の情報が欲しいです。

私は

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      |     | 
+-----------------------------------+--------------------+ 

例えば1つの余分の列が必要な場合は今、私は選択が正しく動作するために得ることができました

これを行う最良の方法は何ですか?

これは、一時テーブルからプログラムテーブルを取り込むための私の挿入コマンドです。現在、上記の選択例で重複して同じ問題があります。

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

そんな単純な質問はどうやって4ページになりましたか?これは恐ろしいです。 –

答えて

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; 

は、上記のあなたの質問に答えていませんが、それはあなたの問題を奪ういくつかのアイデアを与える可能性があり、プログラム情報がそれぞれの何かのために繰り返されているようだ。。あなたはそれが何であるかを知る必要があります。

各プログラムは各ディレクターごとに1回繰り返されますか? 上記のアプローチはさらに意味があります:エンティティと関係を最初に抽出します。

更新2 あなたは、監督がエピソードに関連しているときに、監督をプログラムに強制しますか?それはモデリングエラーと思われます。とにかく、あなたが選んだ監督を気にしなければ、progtitleにグループ化し、他のすべての列の周りにMAX()を使用することができます。それによって、あなたには別個のプロジェクタルと残りの列の値の1つが与えられます。

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

これは、プログラムによってロードされたバッファからデータを挿入した結果です。 – PDStat

+0

多くの情報が失われていたことがわかったので元の投稿を公正なものに更新しました – PDStat

+0

"select distinct a、b、c"を実行する際に同じ問題が発生するため、さらに詳しい説明のために更新 – PDStat

0

これは意味をなさない。どのように行を部分的に区別でき、部分的に区別できないのでしょうか?選択した結果を表とみなします。残りの列に複数の値があるPROGTITLEの値が1つある場合は、データをどのように表現しますか?

+0

ありがとう、私はちょっと明確にするために元の投稿を編集しました – PDStat

+0

簡単に:データベースは1つを選んで残りを捨てます。 –

+0

(これはコメントであって答えではありませんでした) –

0

これは、あなたの質問に答えていませんが、おそらく、ここで自分の道をグーグルで人々のためのそれらにお答えします:

PostgreSQLでは、あなたがこれを行うことができDISTINCT ONを選択して、例えば:

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

私はMySQLと同等の機能を知らない

+0

http://www.postgresql.org/docs/current/static/sql-select.html#SQL-DISTINCT –

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

申し訳ありません、もう少し説明してください – PDStat

+0

あなたの例はまだ分かりません。もし私が一時テーブルとそれらの関連した記述から別個のprogtitlesをすべて選択したいとすれば、上で述べたことから、私は同様のことができるはずです:select description from(tvtemptableからselect distinct progtitle)tvtemptable;しかし、これは私には説明が分からないことを示しています。 – PDStat

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でこれを行うことができるかどうかは分かりません。

関連する問題