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을 사용하고 있지만 이와 같은 작업을 수행 할 수있는 다른 데이터베이스에 관심이 있습니다.
SELECT
s와 결합 된 여러 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'키워드는 없습니다.
보다:
- FROM (T-SQL MSDN 문서) (파생 테이블 아래) 및
- 테이블 값 생성자 (T-SQL MSDN 문서)
이 링크를 발견했습니다 .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
'Development Tip' 카테고리의 다른 글
IE11에서 dispatchEvent가 작동하지 않음 (0) | 2021.01.06 |
---|---|
npm install 명령으로 .bat 파일 만들기 (0) | 2021.01.06 |
django : 해당 모델의 인스턴스에서 모델을 가져 오는 모범 사례 방법 (0) | 2021.01.06 |
DataGridView 컨트롤에서 선택한 모든 행을 선택 취소하는 방법은 무엇입니까? (0) | 2021.01.06 |
면도기로 다른 경우 속기 (0) | 2021.01.06 |