4

映画のデータベースを持っていますが、その年の映画がない年のリストが欲しいのですが。したがって、必要なのはリスト(1900 .. 2012)だけです。そうすれば、必要なものすべてに参加できますが、参加できません。

私が持っている:

CREATE PROCEDURE build_years(p1 SMALLINT) 
BEGIN 
    CREATE TEMPORARY TABLE year (year SMALLINT(5) UNSIGNED); 
    label1: LOOP 
        INSERT INTO year VALUES (p1); 
        SET p1 = p1 + 1; 
        IF p1 > 2012 THEN LEAVE label1; END IF; 
    END LOOP; 
END 

しかし、それは非常に非SQLであり、Pythonコードを実行して同じテーブルを作成するよりもわずかに扱いにくいようです。ストアドプロシージャを使用せず、ループを使用せず、実際のテーブルを使用しないものが、この順序で本当に必要です。

4

6 に答える 6

4

これは、195年以上必要になるまで機能するはずです。その時点で、UNION ALL:を追加する必要があります。

SELECT Year 
FROM   (   SELECT @i:= @i + 1 AS YEAR
           FROM   INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY,
                  ( SELECT @i:= 1899) AS i
        ) As Y
WHERE   Year BETWEEN 1900 AND 2012
ORDER BY Year;

信頼できるテストグラウンドであるSQLFiddleCOLLATION_CHARACTER_SET_APPLICABILITYに基づいて、Systemテーブルのデフォルトサイズは195であると想定していますが

于 2012-06-06T22:10:46.460 に答える
3

私は数年前に同様の問題を抱えていました。私の解決策は次のとおりです。

1.シーケンステーブル

0 から < 必要なだけ > までの整数シーケンスで満たされたテーブルを作成しました。

CREATE TABLE numbers (n INT);
INSERT INTO numbers VALUES (0),(1),(2),(3),(4);
INSERT INTO numbers SELECT n+5 FROM numbers;
INSERT INTO numbers SELECT n+10 FROM numbers;
INSERT INTO numbers SELECT n+20 FROM numbers;
INSERT INTO numbers SELECT n+40 FROM numbers;
etc.

一度だけ実行されるため、手動でもアプリの外部から作成できます。

2. 必要なタイプと範囲のデータを選択します

整数の場合は明らかです - つまり、範囲は 1..99 です:

SELECT n FROM numbers WHERE n BETWEEN 1 AND 99;

日付 - 現在から +2 日までの 2 時間間隔:

SELECT date_add(now(),INTERVAL 2*n HOUR) FROM numbers WHERE n BETWEEN 0 AND 23;

したがって、あなたの場合は次のようになります。

SELECT n+1900 AS n_year FROM numbers WHERE n BETWEEN 0 AND 112;

次にJOIN、それをオンにしn_yearます。

于 2012-06-06T21:22:11.153 に答える
1

本当にクエリに保持したい場合、これは2012年から1900年までのリストを返します..

SELECT 
    TO_CHAR (ADD_MONTHS (TRUNC (SYSDATE, 'YYYY'), ((rno - 1) * -12)), 'YYYY') AS "years"
FROM 
    (
    SELECT 
        LEVEL rno
    FROM DUAL
    CONNECT BY LEVEL <=
                   (SELECT TO_CHAR (TRUNC (SYSDATE, 'YYYY'), 'YYYY')
                           - 1899
                               yearstobuild
                      FROM DUAL))
于 2012-06-06T21:23:10.190 に答える
0

あなたの希望に応じて私が考えることができる唯一の解決策も最悪です...

SELECT years.year FROM
    (
        SELECT 1900 AS year
        UNION SELECT 1901
        ...
        UNION SELECT 2012
    ) AS years
    LEFT OUTER JOIN yourmovietable USING (year)
WHERE yourmovietable.year IS NULL;
于 2012-06-06T21:21:12.297 に答える