Query ServiceMit können Sie Standard-ANSI-SQL für SELECT
-Anweisungen und andere begrenzte Befehle verwenden. This document shows SQL syntax supported by Query Service.
The following syntax defines a SELECT
query supported by Query Service:
[ WITH with_query [, ...] ]
SELECT [ ALL | DISTINCT [( expression [, ...] ) ] ]
[ * | expression [ [ AS ] output_name ] [, ...] ]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition [, ...] ]
[ WINDOW window_name AS ( window_definition ) [, ...] ]
[ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
wobei from_item
eines der Folgenden sein kann:
table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
[ LATERAL ] ( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]
und grouping_element
eines der Folgenden:
( )
expression
( expression [, ...] )
ROLLUP ( { expression | ( expression [, ...] ) } [, ...] )
CUBE ( { expression | ( expression [, ...] ) } [, ...] )
GROUPING SETS ( grouping_element [, ...] )
und with_query
:
with_query_name [ ( column_name [, ...] ) ] AS ( select | values )
TABLE [ ONLY ] table_name [ * ]
Das Schlüsselwort ILIKE kann anstelle von LIKE verwendet werden, um Übereinstimmungen mit der WHERE-Klausel der SELECT-Abfrage zu finden, ohne die Groß-/Kleinschreibung zu berücksichtigen.
[ WHERE condition { LIKE | ILIKE | NOT LIKE | NOT ILIKE } pattern ]
Hier die Logik der LIKE- und ILIKE-Klauseln:
WHERE condition LIKE pattern
, ~~
entspricht patternWHERE condition NOT LIKE pattern
, !~~
entspricht patternWHERE condition ILIKE pattern
, ~~*
entspricht patternWHERE condition NOT ILIKE pattern
, !~~*
entspricht patternSELECT * FROM Customers
WHERE CustomerName ILIKE 'a%';
Gibt Kunden zurück, deren Namen mit „A“ oder „a“ beginnen.
Eine SELECT
-Abfrage mit JOINS hat die folgende Syntax:
SELECT statement
FROM statement
[JOIN | INNER JOIN | LEFT JOIN | LEFT OUTER JOIN | RIGHT JOIN | RIGHT OUTER JOIN | FULL JOIN | FULL OUTER JOIN]
ON join condition
Die UNION
-, INTERSECT
- und EXCEPT
-Klauseln werden unterstützt, um gleichartige Zeilen aus zwei oder mehr Tabellen zu kombinieren oder auszuschließen:
SELECT statement 1
[UNION | UNION ALL | UNION DISTINCT | INTERSECT | EXCEPT | MINUS]
SELECT statement 2
The following syntax defines a CREATE TABLE AS SELECT
(CTAS) query supported by Query Service:
CREATE TABLE table_name [ WITH (schema='target_schema_title', rowvalidation='false') ] AS (select_query)
where,
target_schema_title
is the title of XDM schema. Verwenden Sie diese Klausel nur, wenn Sie ein vorhandenes XDM-Schema für den neuen Datensatz verwenden möchten, der von der CTAS-Abfragerowvalidation
erstellt wurde, um anzugeben, ob der Benutzer die Überprüfung auf Zeilenebene aller neuen Stapel, die für den neu erstellten Datensatz erfasst werden, vornehmen möchte. Standardwert ist "true"
und select_query
ist eine SELECT
-Anweisung, deren Syntax oben in diesem Dokument definiert ist.
CREATE TABLE Chairs AS (SELECT color, count(*) AS no_of_chairs FROM Inventory i WHERE i.type=="chair" GROUP BY i.color)
CREATE TABLE Chairs WITH (schema='target schema title') AS (SELECT color, count(*) AS no_of_chairs FROM Inventory i WHERE i.type=="chair" GROUP BY i.color)
Bitte beachten Sie Folgendes für eine CTAS-Abfrage:
SELECT
-Anweisung muss einen Alias für die Aggregat-Funktionen wie COUNT
, SUM
, MIN
usw. enthalten.SELECT
-Anweisung kann mit oder ohne Klammern () angegeben werden.The following syntax defines an INSERT INTO
query supported by Query Service:
INSERT INTO table_name select_query
wobei select_query
eine SELECT
-Anweisung ist, deren Syntax oben in diesem Dokument definiert ist.
INSERT INTO Customers SELECT SupplierName, City, Country FROM OnlineCustomers;
Bitte beachten Sie Folgendes für eine INSERT INTO-Abfrage:
SELECT
-Anweisung DARF NICHT in Klammern () gesetzt werden.SELECT
-Anweisung muss mit dem in der INSERT INTO
-Anweisung definierten Tabelle übereinstimmen.Löscht eine Tabelle und löscht das mit der Tabelle verknüpfte Verzeichnis aus dem Dateisystem, wenn es sich nicht um eine EXTERNE Tabelle handelt. Wenn die zu löschende Tabelle nicht vorhanden ist, tritt ein Fehler (Ausnahmebedingung) auf.
DROP [TEMP] TABLE [IF EXISTS] [db_name.]table_name
IF EXISTS
: Wenn die Tabelle nicht vorhanden ist, wird nichts ausgeführtTEMP
: Temporäre TabelleThe following syntax defines a CREATE VIEW
query supported by Query Service:
CREATE [ OR REPLACE ] VIEW view_name AS select_query
wobei view_name
der Name der zu erstellenden Ansicht
und select_query
eine SELECT
-Anweisung ist, deren Syntax oben in diesem Dokument definiert ist.
Beispiel:
CREATE VIEW V1 AS SELECT color, type FROM Inventory
CREATE OR REPLACE VIEW V1 AS SELECT model, version FROM Inventory
The following syntax defines a DROP VIEW
query supported by Query Service:
DROP VIEW [IF EXISTS] view_name
wobei view_name
der Name der zu löschenden Ansicht ist
Beispiel:
DROP VIEW v1
DROP VIEW IF EXISTS v1
Legen Sie eine Eigenschaft fest, geben Sie den Wert einer vorhandenen Eigenschaft zurück oder listen Sie alle vorhandenen Eigenschaften auf. Wenn für einen vorhandenen Eigenschaftenschlüssel ein Wert angegeben wird, wird der alte Wert überschrieben.
SET property_key [ To | =] property_value
Um den Wert einer Einstellung zurückzugeben, verwenden Sie SHOW [setting name]
.
Dieser Befehl wird geparst, und der abgeschlossene Befehl wird an den Client zurückgesendet. Dies entspricht dem START TRANSACTION
-Befehl.
BEGIN [ TRANSACTION ]
TRANSACTION
: Optionale Schlüsselwörter. Listet sie auf, es werden keine Maßnahmen ergriffen.CLOSE
gibt die Ressourcen frei, die mit einem geöffneten Cursor verknüpft sind. Nach dem Schließen des Cursors sind keine weiteren Vorgänge zulässig. Ein Cursor sollte geschlossen werden, wenn er nicht mehr benötigt wird.
CLOSE { name }
name
: der Name eines geöffneten Cursors, der geschlossen werden soll.No action is taken in Query Service as a response to the commit transaction statement.
COMMIT [ WORK | TRANSACTION ]
WORK
TRANSACTION
: Optionale Schlüsselwörter. Diese haben keine Auswirkungen.Verwenden Sie DEALLOCATE
, um die Zuordnung einer zuvor vorbereiteten SQL-Anweisung aufzuheben. Wenn Sie die Zuordnung einer vorbereiteten Anweisung nicht explizit aufheben, wird dies am Ende der Sitzung ausgeführt.
DEALLOCATE [ PREPARE ] { name | ALL }
Prepare
: Dieses Keyword wird ignoriert.name
: Der Name der vorbereiteten Anweisung, deren Zuordnung aufgehoben werden soll.ALL
: Die Zuordnung aller vorbereiteten Anweisungen wird aufgehoben.Mit DECLARE
kann ein Benutzer Cursor erstellen, mit denen eine kleine Anzahl von Zeilen gleichzeitig aus einer größeren Abfrage abgerufen werden kann. Nachdem der Cursor erstellt wurde, werden Zeilen mit FETCH
abgerufen.
DECLARE name CURSOR [ WITH HOLD ] FOR query
name
: Der Name des zu erstellenden Cursors.WITH HOLD
: Gibt an, dass der Cursor weiterhin verwendet werden kann, nachdem die Transaktion, die ihn erstellt hatte, erfolgreich abgeschlossen wurde.query
: Ein SELECT
- oder VALUES
-Befehl, der die vom Cursor zurückzugebenden Zeilen angibt.EXECUTE
wird verwendet, um eine zuvor vorbereitete Anweisung auszuführen. Da vorbereitete Anweisungen nur für die Dauer einer Sitzung vorhanden sind, muss die vorbereitete Anweisung durch eine PREPARE
-Anweisung erstellt worden sein, die zuvor in der aktuellen Sitzung ausgeführt wurde.
Wenn in der PREPARE
-Anweisung, mit der die Anweisung erstellt wurde, einige Parameter angegeben wurden, muss ein kompatibler Satz von Parametern an die EXECUTE
-Anweisung übergeben werden. Andernfalls wird ein Fehler ausgegeben. Beachten Sie, dass vorbereitete Anweisungen (im Gegensatz zu Funktionen) nicht aufgrund des Typs oder der Anzahl ihrer Parameter überladen werden. Der Name einer vorbereiteten Anweisung muss innerhalb einer Datenbanksitzung eindeutig sein.
EXECUTE name [ ( parameter [, ...] ) ]
name
: Der Name der vorbereiteten Anweisung, die ausgeführt werden soll.parameter
: Der tatsächliche Wert eines Parameters für die vorbereitete Anweisung. Hierbei muss es sich um einen Ausdruck handeln, der einen Wert liefert, der mit dem Datentyp dieses Parameters kompatibel ist, der bei der Erstellung der vorbereiteten Anweisung festgelegt wurde.Dieser Befehl zeigt den Ausführungsplan an, den der PostgreSQL-Planer für die angegebene Anweisung generiert. Der Ausführungsplan zeigt, wie die in der Anweisung referenzierten Tabellen gescannt werden – durch einfaches sequenzielles Scannen, Index-Scannen usw. – und, wenn mehrere Tabellen referenziert werden, welche Join-Algorithmen werden verwendet, um die erforderlichen Zeilen aus jeder Eingabetabelle zusammenzuführen.
Der wichtigste Teil der Anzeige sind die geschätzten Anweisungsausführungskosten. Das ist die Schätzung des Planers, wie lange die Ausführung der Anweisung dauern wird (gemessen in Kosteneinheiten, die frei wählbar sind, aber üblicherweise Abrufe der Festplattenseite bedeuten). Es werden zwei Zahlen angezeigt: die Startkosten, bevor die erste Zeile zurückgegeben werden kann, und die Gesamtkosten für die Rückgabe aller Zeilen. Bei den meisten Abfragen kommt es auf die Gesamtkosten an. In Kontexten wie einer Unterabfrage in EXISTS wählt der Planer jedoch die geringsten Startkosten anstelle der geringsten Gesamtkosten aus (da die Ausführung ohnehin nach einer Zeile anhält). Wenn Sie die Anzahl der Zeilen begrenzen, die mit einer LIMIT
-Klausel zurückgegeben werden sollen, führt der Planer eine geeignete Interpolation zwischen den Endpunktkosten durch, um abzuschätzen, welcher Plan wirklich der günstigste ist.
Die ANALYZE
-Option bewirkt, dass die Anweisung ausgeführt und nicht nur geplant wird. Anschließend werden der Anzeige die tatsächlichen Laufzeitstatistiken hinzugefügt, einschließlich der insgesamt verstrichenen Zeit, die innerhalb der einzelnen Planknoten verbracht wurde (in Millisekunden), und der Gesamtzahl der zurückgegebenen Zeilen. Damit können Sie sehen, wie genau die Schätzungen des Planers mit der Realität übereinstimmen.
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] statement
where option can be one of:
ANALYZE [ boolean ]
TYPE VALIDATE
FORMAT { TEXT | JSON }
ANALYZE
: Führen Sie den Befehl aus und zeigen Sie die tatsächlichen Laufzeiten und andere Statistiken an. Dieser Parameter ist standardmäßig auf FALSE
voreingestellt.FORMAT
: Geben Sie das Ausgabeformat an, das TEXT, XML, JSON oder YAML sein kann. Die Ausgabe ohne Text enthält dieselben Informationen wie das Textausgabeformat, ist jedoch für Programme einfacher zu analysieren. Dieser Parameter ist standardmäßig auf TEXT
voreingestellt.statement
: Jede SELECT
-, INSERT
-, UPDATE
-, DELETE
-, VALUES
-, EXECUTE
-, DECLARE
-, CREATE TABLE AS
- oder CREATE MATERIALIZED VIEW AS
-Anweisung, deren Ausführungsplan Sie sehen möchten.Denken Sie daran, dass die Anweisung genau genommen ausgeführt wird, wenn die ANALYZE
-Option verwendet wird. Obwohl EXPLAIN
alle Ausgaben verwirft, die SELECT
zurückgibt, verworfen werden, treten andere Nebenwirkungen der Anweisung wie gewohnt auf.
So zeigen Sie den Plan für eine einfache Abfrage in einer Tabelle mit einer einzelnen integer
-Spalte und 10000 Zeilen an:
EXPLAIN SELECT * FROM foo;
QUERY PLAN
---------------------------------------------------------
Seq Scan on foo (cost=0.00..155.00 rows=10000 width=4)
(1 row)
FETCH
ruft Zeilen mit einem zuvor erstellten Cursor ab.
Ein Cursor hat eine verknüpfte Position, die von FETCH
verwendet wird. Der Cursor kann sich vor der ersten Zeile des Abfrageergebnisses, in einer beliebigen Zeile des Ergebnisses oder nach der letzten Zeile des Ergebnisses befinden. Nach der Erstellung wird ein Cursor vor der ersten Zeile positioniert. Nach dem Abrufen einiger Zeilen wird der Cursor auf der zuletzt abgerufenen Zeile positioniert. Wenn FETCH
am Ende der verfügbaren Zeilen ausgeführt wird, bleibt der Cursor nach der letzten Zeile positioniert. Wenn keine solche Zeile vorhanden ist, wird ein leeres Ergebnis zurückgegeben und der Cursor wird je nachdem vor der ersten Zeile bzw. nach der letzten Zeile positioniert.
FETCH num_of_rows [ IN | FROM ] cursor_name
num_of_rows
: Eine möglicherweise vorzeichenbehaftete Ganzzahlkonstante, die die Position oder die Anzahl der abzurufenden Zeilen bestimmt.cursor_name
: Name eines geöffneten Cursors.PREPARE
erstellt eine vorbereitete Anweisung. Eine vorbereitete Anweisung ist ein Server-seitiges Objekt, das zur Leistungsoptimierung verwendet werden kann. Wenn die PREPARE
-Anweisung ausgeführt wird, wird die angegebene Anweisung geparst, analysiert und umgeschrieben. Wenn anschließend ein EXECUTE
-Befehl ausgegeben wird, wird die vorbereitete Erklärung geplant und ausgeführt. Diese Arbeitsteilung vermeidet sich wiederholende Parse-Analysen, während der Ausführungsplan von den angegebenen spezifischen Parameterwerten abhängt.
Vorbereitete Anweisungen können Parameter beinhalten, d. h. Werte, die bei der Ausführung der Anweisung ersetzt werden. Beziehen Sie sich beim Erstellen der vorbereiteten Anweisung auf Parameter nach Position. Verwenden Sie dazu $1, $2 usw. Eine entsprechende Liste von Parameterdatentypen kann optional angegeben werden. Wenn der Datentyp eines Parameters nicht angegeben ist oder als unbekannt deklariert wird, wird der Typ ggf. aus dem Kontext abgeleitet, in dem der Parameter zuerst referenziert wird. Geben Sie beim Ausführen der Anweisung die tatsächlichen Werte für diese Parameter in der EXECUTE
-Anweisung an.
Vorbereitete Anweisungen gelten nur für die Dauer der aktuellen Datenbanksitzung. Wenn die Sitzung endet, wird die vorbereitete Anweisung vergessen, sodass sie neu erstellt werden muss, bevor sie erneut verwendet wird. Dies bedeutet auch, dass eine einzelne vorbereitete Anweisung nicht von mehreren gleichzeitigen Datenbank-Clients verwendet werden kann. Jeder Client kann jedoch eine eigene vorbereitete Anweisung erstellen, die verwendet werden soll. Vorbereitete Anweisungen können mithilfe des DEALLOCATE
-Befehls manuell bereinigt werden.
Vorbereitete Anweisungen haben potenziell den größten Leistungsvorteil, wenn eine einzelne Sitzung zur Ausführung einer großen Anzahl ähnlicher Anweisungen verwendet wird. Der Leistungsunterschied ist besonders dann von Bedeutung, wenn die Anweisungen komplex zu planen oder umzuschreiben sind, wenn die Abfrage beispielsweise mehrere Tabellen umfasst oder mehrere Regeln erfordert. Wenn die Anweisung relativ einfach zu planen und umzuschreiben, aber relativ teuer in der Ausführung ist, ist der Leistungsvorteil von vorbereiteten Anweisungen weniger bemerkbar.
PREPARE name [ ( data_type [, ...] ) ] AS SELECT
name
: Ein beliebiger Name, der dieser vorbereiteten Aussage gegeben wird. Er muss innerhalb einer einzelnen Sitzung eindeutig sein und wird anschließend zum Ausführen oder Deklarieren einer zuvor vorbereiteten Anweisung verwendet.data-type
: Der Datentyp eines Parameters für die vorbereitete Anweisung. Wenn der Datentyp eines bestimmten Parameters nicht angegeben oder als unbekannt angegeben wird, wird er aus dem Kontext abgeleitet, in dem der Parameter zum ersten Mal referenziert wird. Verwenden Sie $ 1, $ 2 usw., um auf die Parameter in der vorbereiteten Anweisung zu verweisen.ROLLBACK
setzt die aktuelle Transaktion zurück und bewirkt, dass alle durch die Transaktion vorgenommenen Aktualisierungen verworfen werden.
ROLLBACK [ WORK ]
WORK
SELECT INTO
erstellt eine neue Tabelle und füllt sie mit Daten, die von einer Abfrage berechnet wurden. Die Daten werden nicht wie bei einem normalen SELECT
an den Client zurückgegeben. Die Spalten der neuen Tabelle haben die Namen und Datentypen, die den Ausgabespalten von SELECT
zugeordnet sind.
[ WITH [ RECURSIVE ] with_query [, ...] ]
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
* | expression [ [ AS ] output_name ] [, ...]
INTO [ TEMPORARY | TEMP | UNLOGGED ] [ TABLE ] new_table
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ WINDOW window_name AS ( window_definition ) [, ...] ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
[ LIMIT { count | ALL } ]
[ OFFSET start [ ROW | ROWS ] ]
[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
[ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]
TEMPORARAY
oder TEMP
: Wenn angegeben, wird die Tabelle als temporäre Tabelle erstellt.UNLOGGED:
: Wenn angegeben, wird die Tabelle als nicht protokollierte Tabelle erstellt.new_table
Der Name der zu erstellenden Tabelle (optional mit Schema versehen).Erstellen Sie eine neue Tabelle films_recent
, die nur aus den aktuellen Einträgen der Tabelle films
besteht:
SELECT * INTO films_recent FROM films WHERE date_prod >= '2002-01-01';
SHOW
zeigt die aktuelle Einstellung der Laufzeitparameter an. Diese Variablen können mithilfe der SET
-Anweisung, durch Bearbeiten der Konfigurationsdatei postgresql.conf, durch die PGOPTIONS
-Umgebungsvariable (bei Verwendung von libpq oder einer libpq-basierten Anwendung) oder durch Befehlszeilenflags beim Starten des Postgres-Servers eingestellt werden.
SHOW name
name
:
SERVER_VERSION
: Zeigt die Versionsnummer des Servers an.
SERVER_ENCODING
: Zeigt die Server-seitige Zeichensatzkodierung an. Derzeit kann dieser Parameter angezeigt, aber nicht eingestellt werden, da die Kodierung zum Zeitpunkt der Datenbankerstellung festgelegt wird.
LC_COLLATE
: Zeigt die Gebietsschemaeinstellung der Datenbank für die Sortierung (Textanordnung) an. Derzeit kann dieser Parameter angezeigt, aber nicht eingestellt werden, da die Einstellung zum Zeitpunkt der Datenbankerstellung festgelegt wird.
LC_CTYPE
: Zeigt die Gebietsschemaeinstellung der Datenbank für die Zeichenklassifizierung an. Derzeit kann dieser Parameter angezeigt, aber nicht eingestellt werden, da die Einstellung zum Zeitpunkt der Datenbankerstellung festgelegt wird.
IS_SUPERUSER
: Wahr (True), wenn die aktuelle Rolle über Superuser-Berechtigungen verfügt.
ALL
: Zeigt die Werte aller Konfigurationsparameter mit Beschreibungen an.Anzeigen der aktuellen Einstellung des Parameters DateStyle
SHOW DateStyle;
DateStyle
-----------
ISO, MDY
(1 row)
Dieser Befehl wird geparst und sendet den abgeschlossenen Befehl zurück an den Client. Dies entspricht dem BEGIN
-Befehl.
START TRANSACTION [ transaction_mode [, ...] ]
where transaction_mode is one of:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
Mit diesem Befehl wird die Ausgabe einer beliebigen SELECT-Abfrage an einen angegebenen Speicherort ausgegeben. Der Benutzer muss Zugriff auf diesen Speicherort haben, damit dieser Befehl erfolgreich ausgeführt werden kann.
COPY query
TO '%scratch_space%/folder_location'
[ WITH FORMAT 'format_name']
where 'format_name' is be one of:
'parquet', 'csv', 'json'
'parquet' is the default format.
Der vollständige Ausgabepfad lautet adl://<ADLS_URI>/users/<USER_ID>/acp_foundation_queryService/folder_location/<QUERY_ID>
Mit diesem Befehl können Sie Primär- oder Fremdschlüsseleinschränkungen zur Tabelle hinzufügen oder ablegen.
Alter TABLE table_name ADD CONSTRAINT Primary key ( column_name )
Alter TABLE table_name ADD CONSTRAINT Foreign key ( column_name ) references referenced_table_name ( primary_column_name )
Alter TABLE table_name ADD CONSTRAINT Foreign key ( column_name ) references referenced_table_name Namespace 'namespace'
Alter TABLE table_name DROP CONSTRAINT Primary key ( column_name )
Alter TABLE table_name DROP CONSTRAINT Foreign key ( column_name )
Das Schema "Tabelle"sollte eindeutig sein und nicht für mehrere Tabellen freigegeben sein. Darüber hinaus ist der Namensraum obligatorisch.
Dieser Befehl Liste alle primären Schlüsseleinschränkungen für die jeweilige Datenbank.
SHOW PRIMARY KEYS
tableName | columnName | datatype | namespace
------------------+----------------------+----------+-----------
table_name_1 | column_name1 | text | "ECID"
table_name_2 | column_name2 | text | "AAID"
Dieser Befehl Liste alle Fremdschlüsseleinschränkungen für die jeweilige Datenbank.
SHOW FOREIGN KEYS
tableName | columnName | datatype | referencedTableName | referencedColumnName | namespace
------------------+---------------------+----------+---------------------+----------------------+-----------
table_name_1 | column_name1 | text | table_name_3 | column_name3 | "ECID"
table_name_2 | column_name2 | text | table_name_4 | column_name4 | "AAID"