Development Tip

SQL에서 "리터럴"테이블을 정의 할 수 있습니까?

yourdevel 2021. 1. 6. 20:31
반응형

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을 사용하고 있지만 이와 같은 작업을 수행 할 수있는 다른 데이터베이스에 관심이 있습니다.


SELECTs와 결합 된 여러 s를 사용 하여 하위 쿼리를 수행 할 수 있다고 가정합니다 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;

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

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


표준 SQL (SQL 2003- http : //savage.net.au/SQL/ 참조 )에서는 다음을 사용할 수 있습니다.

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

좀 더 추격하면 다음을 사용할 수도 있습니다.

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

MySQL에서의 이러한 작업은 별도의 문제인지 여부-하지만 언제든지 추가를 요청하거나 직접 추가 할 수 있습니다 (이게 오픈 소스의 아름다움입니다).


Microsoft T-SQL 2008에서 형식은 다음과 같습니다.

SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b)

즉, 위에서 언급 한 Jonathan과 같지만 'table'키워드는 없습니다.

보다:


이 링크를 발견했습니다 .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;

CREATE TEMPORARY TABLE (ID int, 이름 char (100)) SELECT ....

자세한 내용은 http://dev.mysql.com/doc/refman/5.0/en/create-table.html을 참조하십시오.

(하단 근처)

이는 테이블을 채우는 데 문제가있는 경우 (데이터 유형 불일치) 테이블이 자동으로 삭제된다는 장점이 있습니다.

초기 답변은 FROM SELECT 절을 사용했습니다. 가능하면 테이블을 정리하는 두통을 덜기 때문에 사용하십시오.

Disadvantage ( which may not matter ) with the FROM SELECT is how large is the data set created. A temporary table allows for indexing which may be critical. For the subsequent query. Seems counter-intuitive but even with a medium size data set ( ~1000 rows), it can be faster to have a index created for the query to operate on.


In a word, yes. Even better IMO if your SQL product supports common table expressions (CTEs) i.e. easier on the eye than using a subquery plus the same CTE can be used multiple times e.g. this to 'create' a sequence table of unique integers between 0 and 999 in SQL Server 2005 and above:

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;

except you'd actually do something useful with the Sequence table e.g. parse the characters from a VARCHAR column in a base table.

HOWEVER, if you are using this table, which consists only of literal values, multiple time or in multiple queries then why not make it a base table in the first place? Every database I use has a Sequence table of integers (usually 100K rows) because it is so useful generally.

ReferenceURL : https://stackoverflow.com/questions/985295/can-you-define-literal-tables-in-sql

반응형