2009-06-12 7 views
43

문자 그대로 임시 테이블을 정의 할 수있는 SQL 하위 쿼리 구문이 있습니까? 예를 들어SQL에서 "리터럴"테이블을 정의 할 수 있습니까?

,

SELECT 
    MAX(count) AS max, 
    COUNT(*) AS count 
FROM 
    (
    (1 AS id, 7 AS count), 
    (2, 6), 
    (3, 13), 
    (4, 12), 
    (5, 9) 
) AS mytable 
    INNER JOIN someothertable ON someothertable.id=mytable.id 

같은이 두 개 또는 세 개의 쿼리 할 필요 절약 할 : 다음, 거기에 데이터를 넣고, 임시 테이블을 생성을 조인에서 사용.

저는 MySQL을 사용하고 있지만 이와 비슷한 작업을 할 수있는 다른 데이터베이스에 관심이 있습니다.

답변

42

UNION과 결합한 하위 쿼리를 만들 수 있다고 가정합니다.

SELECT a, b, c, d 
FROM (
    SELECT 1 AS a, 2 AS b, 3 AS c, 4 AS d 
    UNION ALL 
    SELECT 5 , 6, 7, 8 
) AS temp; 
+0

와우, 창조적 인 솔루션입니다! 적어도 작동 할 것 같은데. – thomasrutter

+0

실제로는 =) – Blixt

6

나는이 링크를 발견 Temporary Tables With MySQL

CREATE TEMPORARY TABLE TempTable (ID int, Name char(100)) TYPE=HEAP; 

INSERT INTO TempTable VALUES(1, "Foo bar"); 

SELECT * FROM TempTable; 

DROP TABLE TempTable; 
0

SELECT ....

읽기 이상에서 TEMPORARY TABLE (ID의 INT, 이름 char (100)) CREATE : http://dev.mysql.com/doc/refman/5.0/en/create-table.html

(바닥 근처)

이것은 장점이 있다면 문제가 테이블을 채우는 (데이터 형식 불일치) 테이블이 자동으로 삭제됩니다.

조기 응답은 FROM SELECT 절을 사용했습니다. 가능한 경우 테이블을 청소하는 두통을 저장하기 때문에 그것을 사용하십시오.

FROM SELECT의 단점은 데이터 세트가 얼마나 큰지를 결정하는 데 있습니다. 임시 테이블은 인덱싱을 허용 할 수 있습니다. 후속 쿼리의 경우. 카운터 직관적이지만 중간 크기 데이터 세트 (~ 1000 행) 인 경우에도 쿼리가 작동하도록 생성 된 인덱스를 갖는 것이 더 빠를 수 있습니다. 표준 SQL에서

14

(SQL 2003-http://savage.net.au/SQL/ 참조)가 사용할 수 있습니다

INSERT INTO SomeTable(Id, Count) VALUES (1, 7), (2, 6), (3, 13), ... 

을 좀 더 쫓는, 당신은 또한 사용할 수 있습니다 : MySQL의에서 이러한 일이이다

SELECT * FROM TABLE(VALUES (1,7), (2, 6), (3, 13), ...) AS SomeTable(Id, Count) 

여부 별도의 문제 -하지만 당신은 항상 그것을 추가하거나 자신에게 추가하도록 요청할 수 있습니다 (오픈 소스의 아름다움).

+0

답변 해 주셔서 감사합니다! 유감스럽게도 MySQL (5.0)은 FROM TABLE (VALUES ...)을 좋아하지 않습니다. 그러나 적어도 지금은 그것에 대해 알고 있습니다. – thomasrutter

+0

이 대답은 아마도 수용된 대답보다 유익 할 것입니다. 개인적인 문제도 해결하지 못했습니다. MySQL을 사용하여 여러 답변을 받아 들일 수 있기를 바랍니다. – thomasrutter

+0

반대로 Open Source의 추악한 점은 많은 사람들과 자유 시간을 가진 개발자가 관심을 기울이지 않으면 무시되거나 거부 될 것이라고 묻습니다. DIY 학습 곡선은 다음과 같습니다. 종종 시간이 엄청나게 길다. (대안이 어떤 식 으로든 더 좋다고 말하는 것은 아니다 ...) – Michael

0

한 마디로 예. SQL 제품이 공통 테이블 표현식 (CTE)을 지원하는 경우 IMO가 훨씬 우수합니다. 즉, 하위 쿼리를 사용하는 것보다 눈이 쉬우 며 동일한 CTE를 여러 번 사용할 수 있습니다. 당신을 제외하고

WITH Digits (nbr) AS 
(
SELECT 0 AS nbr UNION ALL SELECT 1 UNION ALL SELECT 2 
UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 
UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 
UNION ALL SELECT 9 
), 
Sequence (seq) AS 
(
SELECT Units.nbr + Tens.nbr + Hundreds.nbr 
    FROM Digits AS Units 
     CROSS JOIN Digits AS Tens 
     CROSS JOIN Digits AS Hundreds 
) 
SELECT S1.seq 
    FROM Sequence AS S1; 

실제로 예를 들어, 시퀀스 테이블과 유용한 무언가를 할 거라고 : SQL Server 2005 및 위의 0과 999 사이의 고유 한 정수의 시퀀스 테이블을 '생성'이 기본 테이블의 VARCHAR 열에서 문자를 파싱합니다.

그러나이 테이블을 사용하는 경우 리터럴 값, 여러 시간 또는 여러 쿼리로 구성된 테이블을 사용하면 처음부터 기본 테이블로 만들지 않으시겠습니까? 내가 사용하는 모든 데이터베이스는 일반적으로 매우 유용하기 때문에 정수 (보통 100K 행)의 시퀀스 테이블을 가지고있다.

18

당신은 PostgreSQL의에서 작업을 수행 할 수 있습니다

=> select * from (values (1,7), (2,6), (3,13), (4,12), (5,9)) x(id, count); 
id | count 
----+------- 
    1 |  7 
    2 |  6 
    3 | 13 
    4 | 12 
    5 |  9 
마이크로 소프트 T-SQL에서

http://www.postgresql.org/docs/8.2/static/sql-values.html

+0

PostgreSQL FTW. –

+0

Spark SQL에서도 작동한다. – jab