3 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
你什么都沒(méi)忽略。Access的數(shù)據(jù)庫(kù)引擎將允許SELECT
沒(méi)有FROM
數(shù)據(jù)源的單行。但是,如果你想UNION
或UNION ALL
多個(gè)行,你必須包括一個(gè)FROM
......即使你不是從數(shù)據(jù)源中引用的任何字段。
我創(chuàng)建了一個(gè)只有一行的表,并添加了一個(gè)檢查約束以確保它始終只有一行。
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 strSqlEnd Sub
該Dual
表對(duì)于以下查詢(xún)很有用:
SELECT "foo" AS my_textFROM DualUNION ALLSELECT "bar"FROM Dual;
我見(jiàn)過(guò)的另一種方法是使用SELECT
帶有TOP 1
或WHERE
子句的語(yǔ)句,將結(jié)果集限制為單行。
注意檢查約束是隨Jet 4添加的,僅可用于從ADO執(zhí)行的語(yǔ)句。CurrentProject.Connection.Execute strSql
之所以有效,CurrentProject.Connection
是因?yàn)樗且粋€(gè)ADO對(duì)象。如果嘗試使用DAO執(zhí)行同CurrentDb.Execute
一條語(yǔ)句(即從Access查詢(xún)?cè)O(shè)計(jì)器或從Access查詢(xún)?cè)O(shè)計(jì)器執(zhí)行),則會(huì)收到語(yǔ)法錯(cuò)誤,因?yàn)镈AO無(wú)法創(chuàng)建檢查約束。

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果您有權(quán)訪問(wèn)某些系統(tǒng)表,則可以通過(guò)以下方式模擬雙重表:
(SELECT COUNT(*) FROM MSysResources) AS DUAL
不幸的是,我不知道任何系統(tǒng)表...
總是可用的,可讀的(并非每個(gè)連接都可以訪問(wèn)MSysObjects)
僅包含一條記錄,例如Oracle
DUAL
或DB2的記錄SYSIBM.DUAL
所以你會(huì)寫(xiě):
SELECT 'Mike' AS FNameFROM (SELECT COUNT(*) FROM MSysResources) AS DUALUNION ALLSELECT 'John' AS FNameFROM (SELECT COUNT(*) FROM MSysResources) AS DUAL
例如,這就是在jOOQ中實(shí)現(xiàn)為語(yǔ)法元素的內(nèi)容。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
當(dāng)您限制了對(duì)數(shù)據(jù)庫(kù)的只讀訪問(wèn)(即,您無(wú)法創(chuàng)建新表或訪問(wèn)系統(tǒng)資源)時(shí),這可能會(huì)起作用:
SELECT "Mike" AS FNameFROM (SELECT COUNT(*) FROM anyTable WHERE 1=0) AS dual
anyTable是您找到的第一個(gè)用戶表(我很難想象沒(méi)有用戶表的真實(shí)數(shù)據(jù)庫(kù)!)。
即使在一張大桌子上,WHERE 1 = 0也應(yīng)該快速返回0計(jì)數(shù)(希望Jet引擎足夠智能以識(shí)別這種瑣碎的情況)。
添加回答
舉報(bào)