次のようなステートメントを持つことは可能ですか?
SELECT "Hello world"
WHERE 1 = 1
SQLで?
私が知りたい主なことは、何もないところからSELECTできるか、つまりFROM句がないかということです。
次のようなステートメントを持つことは可能ですか?
SELECT "Hello world"
WHERE 1 = 1
SQLで?
私が知りたい主なことは、何もないところからSELECTできるか、つまりFROM句がないかということです。
FROM NULLの間SELECTとWHERE。主に宿題であり、腸の感覚が間違っていた場合に誰かに来て答えを教えてほしくないため、言い回しをあいまいにします。
回答:
ベンダー間で一貫性がありません-Oracle、MySQL、およびDB2はデュアルをサポートしています。
SELECT 'Hello world'
FROM DUAL
... SQL Server、PostgreSQL、およびSQLiteはFROM DUAL:を必要としませんが
SELECT 'Hello world'
MySQLは両方の方法をサポートしています。
DUALし、ファントムのようなテーブルからクエリを実行することができます。
これを試して。
シングル:
SELECT * FROM (VALUES ('Hello world')) t1 (col1) WHERE 1 = 1
マルチ:
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
WHERE 1 = 1何ですか?PostgreSQLではそれがなくても動作します。または、別のDMBSに関係しますか?
SELECT * FROM (VALUES ("Hello world")) t1 (col1)まだ細かいです。Whereこの質問に答えるだけです。
SELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
https://blog.jooq.org/tag/dual-table/からのデュアルのデータベースサポートの最も完全なリストは次のとおりです。
他の多くのRDBMSでは、次のようなステートメントを発行できるため、ダミーテーブルは必要ありません。
SELECT 1; SELECT 1 + 1; SELECT SQRT(2);これらはRDBMSであり、上記が一般的に可能です。
- H2
- MySQL
- アングル
- Postgres
- SQLite
- SQLサーバー
- Sybase ASE
他のRDBMSでは、Oracleのように、ダミーテーブルが必要です。したがって、次のようなものを書く必要があります。
SELECT 1 FROM DUAL; SELECT 1 + 1 FROM DUAL; SELECT SQRT(2) FROM DUAL;これらは、RDBMSとそれぞれのダミーテーブルです。
- DB2:SYSIBM.DUAL
- ダービー:SYSIBM.SYSDUMMY1
- H2:オプションでDUALをサポート
- HSQLDB:INFORMATION_SCHEMA.SYSTEM_USERS
- MySQL:オプションでDUALをサポート
- Oracle:DUAL
- Sybase SQL Anywhere:SYS.DUMMY
IngresにはDUALはありませんが、実際にはDUALが必要です。これは、Ingresの場合、FROM句なしでWHERE、GROUP BY、またはHAVING句を使用できないためです。
あなたはできる。StackExchangeデータエクスプローラークエリで次の行を使用しています:
SELECT
(SELECT COUNT(*) FROM VotesOnPosts WHERE VoteTypeName = 'UpMod' AND UserId = @UserID AND PostTypeId = 2) AS TotalUpVotes,
(SELECT COUNT(*) FROM Answers WHERE UserId = @UserID) AS TotalAnswers
データ交換は、Transact-SQL(SQL Server独自のSQL拡張機能)を使用します。
次のようなクエリを実行して、自分で試すことができます。
SELECT 'Hello world'
それは不可能だと思います。理論的には、selectは2種類のことを実行します。
セットを狭める/広げる(集合論);
結果のマッピング。
最初のものは、垂直方向の減少として見ることができるwhere句とは対照的に、水平方向の減少として見ることができます。一方、結合はセットを水平方向に拡張でき、結合はセットを垂直方向に拡張できます。
augmentation diminishing
horizontal join/select select
vertical union where/inner-join
2つ目はマッピングです。マッピングは、よりコンバーターです。SQLでは、いくつかのフィールドを取り、0個以上のフィールドを返します。選択では、sum、avgなどのいくつかの集計関数を使用できます。または、すべての列値を取得して文字列に変換します。C#linqでは、selectはタイプTのオブジェクトを受け入れ、タイプUのオブジェクトを返すと言います。
私はあなたができるという事実によって混乱が来ると思います:select 'howdy' from <table_name>。この機能はマッピングであり、selectのコンバーター部分です。あなたは何かを印刷しているのではなく、変換しています!あなたの例では:
SELECT "
WHERE 1 = 1
何もない/ nullをに変換し"Hello world"、何もない/テーブルなしのセットを1つの行に絞り込みます。これは、まったく意味がありません。
列数を制限しない場合"Hello world"、テーブルで使用可能な行ごとに印刷されることに気付くかもしれません。理由をご理解いただければ幸いです。選択したものは、使用可能な列から何も取得せず、次のテキストで1つの列を作成します"Hello world"。
だから、私の答えはノーです。selectは常にテーブル列を実行する必要があるため、from句を除外することはできません。
標準SQLでは、いいえ。WHERE句は、テーブル式を意味します。
SQL-92仕様から:
7.6「where句」
関数
前の「from句」の結果に「検索条件」を適用して派生したテーブルを指定します。
順番に:
7.4「from句」
関数
1つ以上の名前付きテーブルから派生したテーブルを指定します。
それを行う標準的な方法(つまり、すべてのSQL製品で機能するはずです):
SELECT DISTINCT 'Hello world' AS new_value
FROM AnyTableWithOneOrMoreRows
WHERE 1 = 1;
...WHERE句をより意味のあるものに変更したい場合は、省略できます。
SELECT句が定数のみで構成されていることを認識し、それAnyTableWithOneOrMoreRowsが格納されたテーブルである場合、統計を使用してテーブルにゼロ行。
別の可能性があります-スタンドアロンVALUES():
VALUES ('Hello World');
出力:
column1
Hello World
複数の値をコンパクトに指定する必要がある場合に便利です。
VALUES (1, 'a'), (2, 'b'), (3, 'c');
出力:
column1 column2
1 a
2 b
3 c
この構文は、SQLite / PostgreSQL / DB LUW / MariaDB10.3でサポートされています。
これは古い質問ですが、質問の最善の回避策はダミーのサブクエリを使用することです。
SELECT 'Hello World'
FROM (SELECT name='Nothing') n
WHERE 1=1
このように、ダミーのサブクエリは結果を変更せずにFROM句を強制的に使用するため、selectステートメントの後にWHEREと任意の句(JoinsやApplyなど)を含めることができます。
SELECTなしにFROM、それはまだなどのOracleに失敗しますので、あなたのサブクエリで
SELECT 'Hello' FROM dual WHERE 1=1、サブクエリをスキップできるため、さらに簡単です。
SELECT、FROM節のないステートメント(つまり、)を持つことが可能かどうかを尋ねました。質問を読んでいませんか?
WHERE除いて、なしでは得られないことを知っていますFROM。それを踏まえて、私はOP質問の最初のステートメントに返信しました。
WHEREが標準SQLであるかどうかを覚えていませんでした。私は他の答えも読んだ。ところで:適切なものはことであるあなたが持っていないことができSELECTずにFROMいない「WHEREなしFROM」(?)。@DomingoR、クエリはどこで機能しますか?それはまだ持っていSELECTなくてはFROMためずにクエリを持つことはできませんこれらのDBMSに失敗し、(サブクエリで)FROM標準SQLから逸脱し、持っていない可能とするものにのみ取り組んFROMでSELECT。だからあなたの答えは何の役にも立たない。
私はfirebirdを使用していますまず、このような「NoTable」という名前の1列のテーブルを作成します
CREATE TABLE NOTABLE
(
NOCOLUMN INTEGER
);
INSERT INTO NOTABLE VALUES (0); -- You can put any value
今、あなたはこれを書くことができます
select 'hello world' as name
注目すべきから
表示したい任意の列を追加できます