何もないところから選択しますか?


90

次のようなステートメントを持つことは可能ですか?

SELECT "Hello world"
WHERE 1 = 1

SQLで?

私が知りたい主なことは、何もないところからSELECTできるか、つまりFROM句がないかということです。


3
@Rafael Belliardに対するコメントを見ると、実際に何をしたいのかを尋ねたほうがいいかもしれません。たとえば、特定のテーブルに値が存在する場合、文字列を返しますか?
ジムL

はい、それはまさに私が望んでいたことです。私はそれを行うことができることを知って、私は私が必要な場合は疑問に思った以上FROM NULLの間SELECTWHERE。主に宿題であり、腸の感覚が間違っていた場合に誰かに来て答えを教えてほしくないため、言い回しをあいまいにします。
Ritwik Bose 2010

回答:


140

ベンダー間で一貫性がありません-Oracle、MySQL、およびDB2はデュアルをサポートしています。

SELECT 'Hello world'
  FROM DUAL

... SQL Server、PostgreSQL、およびSQLiteはFROM DUAL:を必要としませんが

SELECT 'Hello world'

MySQLは両方の方法をサポートしています。


2
私はいつも疑問に思っていました。ファントムテーブルにデュアルという用語を選択するのはなぜですか?
Alex Blakemore 2010

5
@Alex:「元のDUALテーブルには2つの行がありましたが(そのためその名前が付けられました)、その後は1つの行しかありませんでした。」
rebelliard 2010

7
DB2では、デュアルは「sysibm.sysdummy1」と呼ばれます
ダニューブセーラー

1
Postgresqlでは、と呼ばれるダミーテーブルを作成DUALし、ファントムのようなテーブルからクエリを実行することができます。
ステファン

1
@AlexBlakemore「OracleDataDictionaryの基になるオブジェクトとしてDUALテーブルを作成しました。それ自体が表示されることを意図したものではなく、クエリが実行されると予想されるビュー内で使用されました。アイデアは、JOINを実行できるというものでした。 DUALテーブルを作成し、テーブルの1行ごとに結果に2行を作成します。次に、GROUP BYを使用して、結果の結合を要約し、DATAエクステントとINDEXエクステントのストレージの量を表示できます。名前、DUALは、ただ一つ」(から行のペアを作成するプロセスのためのaptのように見えたen.wikipedia.org/wiki/DUAL_table
[OK]をクリックして


14

これを試して。

シングル:

SELECT *  FROM (VALUES ('Hello world')) t1 (col1) WHERE 1 = 1

マルチ:

SELECT *  FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1

詳細はこちら:http//modern-sql.com/use-case/select-without-from


1
ANSI SQLに準拠した唯一の答えです!(
dbmsが

目的はWHERE 1 = 1何ですか?PostgreSQLではそれがなくても動作します。または、別のDMBSに関係しますか?
フランキー・ドレイク

のみ、SELECT * FROM (VALUES ("Hello world")) t1 (col1)まだ細かいです。Whereこの質問に答えるだけです。
chuongtv

@chuongtv複数の行をどのように選択しますか?
ヘクター

@HectorSQLの構造体挿入に従ってください。このようなSELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
chuongtv

8

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句を使用できないためです。


6

SQL Serverのタイプ:

Select 'Your Text'

FROMorWHERE句は必要ありません。


5

あなたはできる。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'

データ交換は、SQLServerに基づくAzureです。
OMGポニー

2

それは不可能だと思います。理論的には、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句を除外することはできません。


2

標準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句をより意味のあるものに変更したい場合は、省略できます。


ERROR:コラム「こんにちは世界」MY_TABLEには存在しません:コラム「こんにちは世界」MY_TABLEクエリには存在しませんが、PostgreSQLが言っ失敗
PAL Brattberg

@PålBrattberg:一重引用符である必要があり、修正されました。
2016年

処理時間の観点から、どのテーブルを使用するかは重要ですか?または、SELECTがどの列も参照していないという事実により、実際のテーブルは無関係になりますか?
アレングールド

@AllenGould:「ベンダーに依存」しますが、悪用される可能性のある明らかな短絡があります。たとえば、オプティマイザーがSELECT句が定数のみで構成されていることを認識し、それAnyTableWithOneOrMoreRowsが格納されたテーブルである場合、統計を使用してテーブルにゼロ行。
2017

2

別の可能性があります-スタンドアロンVALUES()

VALUES ('Hello World');

出力:

column1
Hello World

複数の値をコンパクトに指定する必要がある場合に便利です。

VALUES (1, 'a'), (2, 'b'), (3, 'c');

出力:

column1     column2
      1     a
      2     b
      3     c

DBFiddleデモ

この構文は、SQLite / PostgreSQL / DB LUW / MariaDB10.3でサポートされています。


2

ClickHouseの場合、何もありません system.one

SELECT 1 FROM system.one

1

Firebirdでは、次のことができます。

select "Hello world" from RDB$DATABASE;

RDB $ DATABASEは、常に1行の特別なテーブルです。


0

これは古い質問ですが、質問の最善の回避策はダミーのサブクエリを使用することです。

SELECT 'Hello World'
FROM (SELECT name='Nothing') n
WHERE 1=1

このように、ダミーのサブクエリは結果を変更せずにFROM句を強制的に使用するため、selectステートメントの後にWHEREと任意の句(JoinsやApplyなど)を含めることができます。


1
あなたはまだ持っているSELECTなしにFROM、それはまだなどのOracleに失敗しますので、あなたのサブクエリで
ペール

OracleではSELECT 'Hello' FROM dual WHERE 1=1、サブクエリをスキップできるため、さらに簡単です。
DomingoR 2017年

OPはSELECTFROM節のないステートメント(つまり、)を持つことが可能かどうかを尋ねました。質問を読んでいませんか?
ペレ

私は質問を読みましたが、SQLにまったく慣れていない(または他の回答を読んでいない)場合をWHERE除いて、なしでは得られないことを知っていますFROM。それを踏まえて、私はOP質問の最初のステートメントに返信しました。
DomingoR 2017年

ええと、私はSQL、コンピューティングの学位で15年以上の経験があり、現在WHEREが標準SQLであるかどうかを覚えていませんでした。私は他の答えも読んだ。ところで:適切なものはことであるあなたが持っていないことができSELECTずにFROMいない「WHEREなしFROM」(?)。@DomingoR、クエリはどこで機能しますか?それはまだ持っていSELECTなくてはFROMためずにクエリを持つことはできませんこれらのDBMSに失敗し、(サブクエリで)FROM標準SQLから逸脱し、持っていない可能とするものにのみ取り組んFROMSELECT。だからあなたの答えは何の役にも立たない。
ペレ

0

私はfirebirdを使用していますまず、このような「NoTable」という名前の1列のテーブルを作成します

CREATE TABLE NOTABLE 
(
  NOCOLUMN              INTEGER
);
INSERT INTO NOTABLE VALUES (0); -- You can put any value

今、あなたはこれを書くことができます

select 'hello world' as name

注目すべきから

表示したい任意の列を追加できます


0

DB2の場合:

`VALUES('Hello world')`

複数の「行」を実行することもできます。

`VALUES('Hello world'),('Goodbye world');`

タイプが一致する限り、結合でそれらを使用することもできます。

VALUES(1,'Hello world')
UNION ALL
VALUES(2,'Goodbye world');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.