[SQL] 표가없는 MS Access에서 UNION 쿼리 (제트 / ACE)
SQL표가없는 MS Access에서 UNION 쿼리 (제트 / ACE)
예상대로이 작동합니다 :
SELECT "Mike" AS FName
이 오류 "쿼리 입력 하나 개 이상의 테이블이나 쿼리를 포함해야합니다"와 함께 실패합니다 :
SELECT "Mike" AS FName
UNION ALL
SELECT "John" AS FName
이것은 단지 특질 / 제한 제트 / ACE 데이터베이스 엔진 또는 내가 놓친 게 뭔가?
해결법
-
==============================
1.당신은 아무 것도 간과하지 않았다. 액세스 '데이터베이스 엔진은 하나의 행이 데이터 소스의없이 SELECT 수 있습니다. 당신이 UNION이나 UNION ALL 여러 행을 원한다면, 당신은 당신이 데이터 소스에서 모든 필드를 참조하지 않더라도 ...에서 포함되어야합니다.
당신은 아무 것도 간과하지 않았다. 액세스 '데이터베이스 엔진은 하나의 행이 데이터 소스의없이 SELECT 수 있습니다. 당신이 UNION이나 UNION ALL 여러 행을 원한다면, 당신은 당신이 데이터 소스에서 모든 필드를 참조하지 않더라도 ...에서 포함되어야합니다.
나는 하나 개의 행이있는 테이블을 생성하고 항상 오직 하나 개의 행을 보장하기 위해 점검 제한 조건을 추가했다.
Public Sub CreateDualTable() Dim strSql As String strSql = "CREATE TABLE Dual (id COUNTER CONSTRAINT pkey PRIMARY KEY);" Debug.Print strSql CurrentProject.Connection.Execute strSql strSql = "INSERT INTO Dual (id) VALUES (1);" Debug.Print strSql CurrentProject.Connection.Execute strSql strSql = "ALTER TABLE Dual" & vbNewLine & _ vbTab & "ADD CONSTRAINT there_can_be_only_one" & vbNewLine & _ vbTab & "CHECK (" & vbNewLine & _ vbTab & vbTab & "(SELECT Count(*) FROM Dual) = 1" & vbNewLine & _ vbTab & vbTab & ");" Debug.Print strSql CurrentProject.Connection.Execute strSql End Sub
즉, 듀얼 테이블은 이와 같은 쿼리에 유용합니다 :
SELECT "foo" AS my_text FROM Dual UNION ALL SELECT "bar" FROM Dual;
내가 본 또 다른 방법은 TOP 1 SELECT 문 또는 단일 행 결과 집합을 제한하는 조항을 사용하는 것입니다.
주 점검 제한 조건은 제트 4 추가 ADO에서 실행 문에서만 사용할 수 있습니다되었다. 은 CurrentProject.Connection는 ADO 객체이기 때문에 CurrentProject.Connection.Execute STRSQL 작동합니다. 당신이 DAO로 (즉, CurrentDb.Execute 또는 액세스 쿼리 디자이너에서) 같은 문을 실행하려고하면 DAO는 점검 제한 조건을 만들 수 없기 때문에, 당신은 구문 오류가 발생합니다.
-
==============================
2.일부 시스템 테이블에 액세스 할 수있는 경우, 당신은 이중 테이블이 방법을 에뮬레이션 할 수 있습니다 :
일부 시스템 테이블에 액세스 할 수있는 경우, 당신은 이중 테이블이 방법을 에뮬레이션 할 수 있습니다 :
(SELECT COUNT(*) FROM MSysResources) AS DUAL
불행하게도, 그 어떤 시스템 테이블의 잘 모르는 것 같아요 ...
당신이 쓰는 거라고 그래서 :
SELECT 'Mike' AS FName FROM (SELECT COUNT(*) FROM MSysResources) AS DUAL UNION ALL SELECT 'John' AS FName FROM (SELECT COUNT(*) FROM MSysResources) AS DUAL
이것은 예를 들어, jOOQ의 구문 요소로 구현되는 것입니다.
-
==============================
3.데이터베이스에 대한 읽기 전용 액세스를 제한 한 경우 (즉 당신이 새 테이블 또는 액세스 시스템 리소스를 만들 수 없습니다),이 일할 수 :
데이터베이스에 대한 읽기 전용 액세스를 제한 한 경우 (즉 당신이 새 테이블 또는 액세스 시스템 리소스를 만들 수 없습니다),이 일할 수 :
SELECT "Mike" AS FName FROM (SELECT COUNT(*) FROM anyTable WHERE 1=0) AS dual
-
==============================
4.여기에 그것을 할 수있는 매우 간단한 방법이다 :
여기에 그것을 할 수있는 매우 간단한 방법이다 :
SELECT 'foo', 'boo', 'hoo' from TableWith1Row union SELECT 'foo1', 'boo1', 'hoo1' from TableWith1Row
중요 : TableWith1Row 어느 문자 그대로 한 기록이있는 테이블을 할 수있다 (어쨌든 무시하는) 또는 행의 수와 테이블이 될 수 있습니다 (적어도 1 행이 있어야합니다) 그러나 당신이 1 개 행을 보장하기 위해 WHERE 절을 추가합니다. 이 비트 loosy - goosy이지만 이상의 테이블을 만들지 않고이 일을 할 수있는 빠른 방법입니다.
-
==============================
5.누군가가 최고 1 방법을 사용하고자한다면 다음과 같을 것이다 :
누군가가 최고 1 방법을 사용하고자한다면 다음과 같을 것이다 :
SELECT first_name AS FName FROM tblname UNION ALL SELECT "Mike" as Fname FROM (Select Top 1 Count(*) FROM tblsometable);
필드의 별칭이 경우 "FNAME"에서, 노동 조합의 양쪽에서 동일해야한다.
-
==============================
6.모든 테이블 이름을 넣어 (실제로에서 열을 선택에 당신은 필요가 없습니다).
모든 테이블 이름을 넣어 (실제로에서 열을 선택에 당신은 필요가 없습니다).
이 쿼리는 나에게 내가 드롭 다운에 필요한 3 회계 연도 있습니다. 회계 연도 7 월에 시작됩니다.
SELECT IIf(Month(Now())>6,Year(Now())-1,Year(Now())-2) AS FY FROM table UNION SELECT IIf(Month(Now())>6,Year(Now()),Year(Now())-1) AS FY FROM table UNION SELECT IIf(Month(Now())>6,Year(Now())+1,Year(Now())) AS FY FROM table;
from https://stackoverflow.com/questions/7933518/table-less-union-query-in-ms-access-jet-ace by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 저장된 프로 시저에 테이블 이름을 통과해야합니까? (0) | 2020.03.24 |
---|---|
[SQL] SQL Server의 CONCAT 그룹 [중복] (0) | 2020.03.24 |
[SQL] SQL 쿼리는 SQL Server의 열을 기준으로 그룹과 함께 쉼표 구분에 집계 된 결과를 얻을 수 있습니다 (0) | 2020.03.24 |
[SQL] 어떻게 레일과 WHERE 절에서 IN의 대신에 사용 하는가? (0) | 2020.03.24 |
[SQL] MySQL은 : GROUP BY에없는 (0) | 2020.03.24 |