1

SQLite 3 に移植したい次の SQL Server クエリがありますが、気に入らず、"near (".

いくつかのデバッグの後、問題は、SQLite がサブクエリ エイリアスの後の列指定子を好まないことにあるようです (これらを二重アスタリスクで示しました)。

このクエリを SQLite で動作させるにはどうすればよいですか?

    SELECT  rowSet.DBId_0,
        rowSet.TableID_0, 
        CASE WHEN rowSet.HasIdentity_0 != rowSet.HasIdentity_1 THEN 1 ELSE 0 END 'Result'
FROM (
    SELECT * 
    FROM
    (
        SELECT 'Master' AS 'Db', z.[DBId], z.[TableId], MAX(z.[MaxIdentity]) AS 'HasIdentity' 
        FROM
        (
            SELECT so.[DBId], sc.[TableId], MAX(CAST(sc.[Identity] AS TINYINT)) AS MaxIdentity
            FROM syscolumns sc
                JOIN sysobjects so ON sc.[tableid] = so.[id]
            WHERE so.[dbid] = 1
            GROUP BY so.[DBId], sc.[TableId], sc.[Identity]
        ) z
        GROUP BY z.[DBId], z.TableId
    ) **src (Db_0, DBId_0, TableID_0, HasIdentity_0)**
    JOIN 
    (
        SELECT 'Target' AS 'Db', z.[DBId], z.[TableId], MAX(z.[MaxIdentity]) AS 'HasIdentity' 
        FROM
        (
            SELECT so.[DBId], sc.[TableId], MAX(CAST(sc.[Identity] AS TINYINT)) AS MaxIdentity
            FROM target.syscolumns sc
                JOIN target.sysobjects so ON sc.[tableid] = so.[id]
            WHERE so.[dbid] = 1
            GROUP BY so.[DBId], sc.[TableId], sc.[Identity]
        ) z
        GROUP BY z.[DBId], z.TableId
    ) **tar (Db_1, DBId_1, TableID_1, HasIdentity_1)** ON tar.[DBId_1] = src.[DBId_0] AND tar.[TableId_1] = src.[TableId_0]
) rowSet

試すことができるサンプルクエリを次に示します。

これは機能します(SQLiteで):

select col1, col2
from
(
    select 1 as 'col1', 2 as 'col2'
    union
    select 3 as 'col1', 4 as 'col2'
)

これは(SQLiteでは)そうではありません:

select col1, col2
from
(
    select 1 as 'col1', 2 as 'col2'
    union
    select 3 as 'col1', 4 as 'col2'
) z (col1, col2)
4

2 に答える 2

2

列の名前を変更する標準的な SQL の方法は、列のエイリアスを使用することです。

SELECT z.col1, z.col2
FROM
(
    SELECT 1 AS col1, 2 AS col2
    UNION ALL
    SELECT 3,         4
) AS z
于 2013-06-29T21:07:26.110 に答える
1

サブクエリ内で列に別名を付けることができますが、テーブルの別名では、別名を再度指定することはできません。次のクエリでは、サブクエリの外側でテーブルのエイリアスを指定し、内側で列のエイリアスを指定できます。

select col1, something
from
(
    select 1 as 'col1', 2 as 'something'
    union
    select 3, 4 
) z
于 2013-06-29T21:16:31.023 に答える