sourcecode

MySQL "WITH" 절

copyscript 2022. 9. 24. 10:13
반응형

MySQL "WITH" 절

MySQL을 사용하여 "WITH" 절을 사용하여 보기를 생성하려고 합니다.

WITH authorRating(aname, rating) AS
   SELECT aname, AVG(quantity)
   FROM book
   GROUP BY aname

하지만 MySQL은 이를 지원하지 않는 것 같습니다.

저는 이것이 매우 표준적이라고 생각했고 Oracle도 이를 지원한다고 확신합니다.MySQL에 WITH 절을 사용하도록 강제할 수 있는 방법이 있습니까?MyISAM과 innoDB 엔진으로 시험해 보았습니다.둘 다 작동이 안 돼요.

업데이트: MySQL 8.0은 재귀적 CTE를 포함한 일반적인 테이블 표현식의 기능을 드디어 도입했습니다.

다음 블로그에서 이를 알립니다.http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

아래는 제가 2008년에 썼던 이전의 답변입니다.


5.는 MySQL 5.x를 .WITHSQL-99에서 정의된 구문(Common Table Expressions라고도 함)입니다.

이것은 2006년 1월부터 MySQL에 대한 기능 요청입니다.http://bugs.mysql.com/bug.php?id=16244

일반적인 테이블 표현을 지원하는 기타 RDBMS 제품:

다음과 같은 것에 관심이 있을 수 있습니다.

select * from (
    select * from table
) as Subquery

올바른 구문입니다.

WITH AuthorRating(AuthorName, AuthorRating) AS
   SELECT aname         AS AuthorName,
          AVG(quantity) AS AuthorRating
   FROM Book
   GROUP By Book.aname

그러나 다른 사용자가 언급했듯이 MySQL은 이 명령을 지원하지 않습니다.WITH는 SQL:1999에 추가되었습니다.SQL 표준의 최신 버전은 SQL:2008입니다.SQL:1999의 다양한 기능을 지원하는 데이터베이스에 대한 자세한 내용은 Wikipedia에서 확인할 수 있습니다.

MySQL은 전통적으로 SQL 표준 지원에서 다소 뒤처진 반면, Oracle, SQL Server(최근) 및 DB2와 같은 상용 데이터베이스는 이러한 표준을 좀 더 가깝게 따르고 있습니다.포스트그레SQL은 일반적으로 표준 규격도 준수합니다.

MySQL의 로드맵을 참조하는 것이 좋을지도 모릅니다.이 기능이 언제 지원될지는 모르겠지만 읽기 쉬운 롤업 쿼리를 작성하는데 매우 적합합니다.

Oracle은 WITH를 지원합니다.

이렇게 생겼을 거예요.

WITH emps as (SELECT * FROM Employees)
SELECT * FROM emps WHERE ID < 20
UNION ALL
SELECT * FROM emps where Sex = 'F'

@ysth WITH는 일반적으로 검색에서 제외되는 일반적인 단어이기 때문에 검색하기가 어렵습니다.

SELECT 문서를 보고 하위 쿼리 팩터링이 어떻게 작동하는지 확인할 수 있습니다.

이게 작전 수행에 도움이 되지 않는 건 알지만 당신이 시작한 혼란은 제가 정리하고 있습니다.

@Mosty Mostacho의 답변을 바탕으로 MySQL에서 어떤 엔트리가 테이블에 존재하지 않고 다른 데이터베이스에 존재하지 않는지 판별하는 방법을 소개합니다.

select col1 from (
   select 'value1' as col1 union
   select 'value2' as col1 union
   select 'value3' as col1
) as subquery
left join mytable as mytable.mycol = col1
where mytable.mycol is null
order by col1

매크로 기능이 있는 텍스트 편집기를 사용하여 값 리스트를 따옴표로 묶인 select union 절로 변환할 수 있습니다.

MariaDB는 현재 WITH를 지원하고 있습니다.현재 MySQL은 그렇지 않습니다.https://mariadb.com/kb/en/mariadb/with/

Temporary Table을 사용해 본 적이 있습니까?이것으로 나의 콘번은 해결되었다.

create temporary table abc (
column1 varchar(255)
column2 decimal
);
insert into abc
select ...
or otherwise
insert into abc
values ('text', 5.5), ('text2', 0815.8);

그런 다음 이 세션의 모든 선택 항목에서 다음 표를 사용할 수 있습니다.

select * from abc inner join users on ...;
   WITH authorRating as (select aname, rating from book)
   SELECT aname, AVG(quantity)
   FROM authorRating
   GROUP BY aname

언급URL : https://stackoverflow.com/questions/324935/mysql-with-clause

반응형