복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    3.데이터베이스에 대한 읽기 전용 액세스를 제한 한 경우 (즉 당신이 새 테이블 또는 액세스 시스템 리소스를 만들 수 없습니다),이 일할 수 :

    데이터베이스에 대한 읽기 전용 액세스를 제한 한 경우 (즉 당신이 새 테이블 또는 액세스 시스템 리소스를 만들 수 없습니다),이 일할 수 :

    SELECT "Mike" AS FName
    FROM (SELECT COUNT(*) FROM anyTable WHERE 1=0) AS dual
    
  4. ==============================

    4.여기에 그것을 할 수있는 매우 간단한 방법이다 :

    여기에 그것을 할 수있는 매우 간단한 방법이다 :

    SELECT 'foo', 'boo', 'hoo' from TableWith1Row
    union
    SELECT 'foo1', 'boo1', 'hoo1' from TableWith1Row
    

    중요 : TableWith1Row 어느 문자 그대로 한 기록이있는 테이블을 할 수있다 (어쨌든 무시하는) 또는 행의 수와 테이블이 될 수 있습니다 (적어도 1 행이 있어야합니다) 그러나 당신이 1 개 행을 보장하기 위해 WHERE 절을 추가합니다. 이 비트 loosy - goosy이지만 이상의 테이블을 만들지 않고이 일을 할 수있는 빠른 방법입니다.

  5. ==============================

    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. ==============================

    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;
    
  7. from https://stackoverflow.com/questions/7933518/table-less-union-query-in-ms-access-jet-ace by cc-by-sa and MIT license