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?


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.


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.


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;

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;

Wie würden Sie aus Neugier auch Einschränkungen usw. kopieren?
Thufir


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.


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

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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.