Warum sollte "where 1 = 2" in einer SQL CREATE TABLE-Syntax verwendet werden?

82
CREATE TABLE EMPL_DEMO AS SELECT * FROM employees WHERE 1=2;

Ich habe diese Aussage irgendwo im Internet gelesen, konnte sie aber nicht verstehen WHERE 1=2.

Kann jemand das bitte erklären?

Omid Shagiwal
quelle
4
tl; dr 1 = 2 wird für alle Zeilen als FALSE bewertet
Dennis Jaheruddin
27
Es ist ein kleiner Hack, um zu vermeiden, dass die gesamte Spaltenstruktur erneut eingegeben werden muss. Es wird eine Tabelle mit denselben Spaltennamen und Datentypen erstellt, ohne jedoch Datenzeilen oder Schlüssel zu kopieren.
Adwaenyth
Dies spart 2 (zwei) Zeichen, wenn "1 = 2" eingegeben wird: 3 Zeichen, "Falsch": 5
Zeichen
1
Bitte beachten Sie, dass dies keineswegs Standard-SQL ist. Es funktioniert in MySQL, nicht sicher über andere Dialekte.
Álvaro González

Antworten:

108

Diese Art von Befehl wird normalerweise verwendet, um die Struktur einer Tabelle in eine andere zu kopieren. In diesem Fall EMPL_DEMOhat die gleiche Spaltenstruktur von employees, mit Ausnahme der Schlüssel oder Einschränkungen .

Das wird 1=2immer ausgewertet, Falsewodurch verhindert wird, dass Sie eine der Zeilen kopieren.

DrZoo
quelle
2
@ jpmc26 Ich denke "identisch" war eine schlechte Wahl. Ich bezog mich nur auf die Spaltenstruktur.
DrZoo
Es werden auch keine Indizes oder Einschränkungen angezeigt. Im Wesentlichen werden Sie eine Kopie der Spalten mit den entsprechenden Datentypen
erstellen
7
Wenn Sie auch alle Einschränkungen, Indizes usw. kopieren möchten, würden SieCREATE TABLE new_table LIKE old_table
Barmar
1
@Barmar, es sei denn, es ist etwas Neues, LIKE old_tableist kein SQL Server-Konstrukt ...
WernerCD
1
Ich denke, Ihre Bedeutung der Spaltenstruktur ist gerecht nameund typeder Spalte. Bedenken Sie, dass es einige andere Eigenschaften gibt, die auch als Spaltenstruktur gelten - z. B. Standardwert, Alias ​​usw.;).
shA.t
27

CREATE TABLE (Neue Tabelle erstellen)

EMPL_DEMO (EMPL_DEMO genannt)

AS (Mit den Daten und der Struktur von)

SELECT * FROM employees WHERE 1=2; (Alles in Mitarbeitern mit 1 = 2. Da 1 niemals 2 ist - kopieren Sie die Struktur und alle 0 übereinstimmenden Zeilen)

Kopieren Sie im Wesentlichen die Struktur und nicht die Daten.

Fazer87
quelle
14

Diese Syntax macht dasselbe, aber es ist offensichtlicher, dass sie eine Tabelle mit derselben Struktur ohne Daten erstellt.

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees limit 0;
fraff
quelle
2
LIMIT hat einige Popularität, aber es ist (leider) nicht annähernd ein Standard
bgusach
1
@bgusach, jeeze, das ist so verrückt. Ich konnte mir nicht vorstellen, dass es eine realistische DB möglicherweise nicht geben könnte LIMIT. Aber es scheint, dass MSSQL es nicht hat (was mir als guter Grund erscheint, MSSQL einfach nicht zu verwenden). Anscheinend haben sie TOP, aber Google-Ergebnisse haben so viele Leute, die das nicht verwenden, also gibt es wahrscheinlich einige Hijink, die es umgeben.
Kat
@Kat Einige haben es , viele andere nicht (einschließlich Standard-SQL). Was ist das Besondere an dieser speziellen Syntax?
Álvaro González
Es geht nicht um die Syntax, @ ÁlvaroGonzález, aber die Funktionalität selbst ist IMO ziemlich kritisch. Vielleicht nicht so sehr für diesen Fall (obwohl ich es besser lesbar sehe als die anderen Optionen), aber es ist offensichtlich nützlich für die Paginierung von Ergebnissen. Als ich nach "MSSQL LIMIT" suchte, waren einige der vorgeschlagenen Problemumgehungen verrückt nach einer Funktion, die sich als integraler Bestandteil von SQL anfühlt (ich war auch überrascht, dass sie nicht Standard war - wer kann verfolgen, was ist und was? ist SQL nicht so fragmentiert?).
Kat
7

Dies kann nützlich sein, um die Struktur einer Tabelle ohne deren Einschränkungen, Schlüssel, Indizes, Identitätseigenschaften und Datenzeilen zu kopieren .

Diese Abfrage erstellt eine EMPL_DEMOTabelle ohne Zeilen, die aus der Mitarbeitertabelle kopiert wurden, da die WHERE 1=2Bedingung immer als ausgewertet wird FALSE.

  CREATE TABLE EMPL_DEMO 
  AS 
  SELECT * 
  FROM employees 
  WHERE 1=2;
Vishwanath Dalvi
quelle
Wie würden Sie aus Neugier auch Einschränkungen usw. kopieren?
Thufir
@ Thufir Hilfreiche Post dba.stackexchange.com/questions/65734/…
Vishwanath Dalvi
6

Vertraue auf Google, mein Freund. Am Ende des ersten Ergebnisses, wenn Sie diese Aussage googeln :

Zum Beispiel:

CREATE TABLE suppliers
  AS (SELECT *
    FROM companies WHERE 1=2);

Dies würde eine neue Tabelle mit dem Namen Lieferanten erstellen, die alle Spalten aus der Unternehmenstabelle, jedoch keine Daten aus der Unternehmenstabelle enthält.

Silas B.
quelle
41
Beachten Sie, dass die Google-Suchergebnisse für jeden Nutzer angepasst werden, je nachdem, was Google über den Nutzer weiß. Daher ist die Reihenfolge der Ergebnisse wahrscheinlich für alle unterschiedlich, und folglich besteht die Gefahr, dass "das erste Ergebnis" für alle unterschiedlich ist. In meinem Fall ist das beste Ergebnis für diese Abfrage diese Frage , und die Seite, auf die Sie verlinken, wird nicht einmal unter den drei Treffern angezeigt.
Benutzer
2
Verwenden Sie beim Verweisen auf das n-te Ergebnis eine Suchmaschine wie DuckDuckGo , die für jede Abfrage im Laufe der Zeit statische Ergebnisse liefert.
wizzwizz4
@ MichaelKjörling Früher gab es eine Option, um statische ("nicht personalisierte") Ergebnisse anzuzeigen. Ich weiß nicht, wie gut es funktioniert hat, als es da war, aber es ist jetzt weg, da es den Anschein hat, dass Benutzerdaten so stark mit dem PageRank-Algorithmus verflochten sind.
oldmud0
1
@ oldmud0: Ich glaube nicht, dass es weg ist? Zwischen privaten Ergebnissen und Alle benutzerdefinierten Ergebnisse entfernen Ich denke, es sollte konfigurierbar sein?
user541686
1
@Mehrdad Der zweite Link besagt unter "Alle benutzerdefinierten Ergebnisse entfernen", dass einer der erforderlichen Schritte darin besteht, sich bei Ihrem Google-Konto anzumelden, sodass dies offensichtlich nicht für diejenigen verfügbar ist, die kein Google-Konto haben. Der Name der Einstellung gibt außerdem an, dass nur Anzeigen und keine Suchergebnisse betroffen sind. Der Text weist jedoch darauf hin, dass sich dies auch auf die Ergebnisse auswirkt, sodass dies bestenfalls unklar ist.
Benutzer
1

Orakel:

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees WHERE 1=2; //just structure not data

CREATE TABLE EMPL_DEMO AS SELECT * FROM employees WHERE 1=1; //ststructure and data

Besseres Verständnis in der Teradata-Datenbank:

CREATE TABLE EMPL_DEMO AS Memployees with no data; //structure

CREATE TABLE EMPL_DEMO AS Memployees with data; //structure and data
13957813157
quelle
1

In SQL Server

Wählen Sie * in Tabelle1 aus Tabelle2 aus, wobei 1 = 2 (nur Struktur)

Wählen Sie * in Tabelle1 aus Tabelle2 aus, wobei 1 = 1 (Struktur mit Daten)

Sai Kumar Reddy
quelle