SELECT¶
SELECT kann entweder als Anweisung oder als Klausel innerhalb anderer Anweisungen verwendet werden:
Die SELECT-Anweisung ist die am häufigsten ausgeführte SQL-Anweisung. Sie fragt die Datenbank ab und ruft eine Menge von Zeilen ab.
Als Klausel definiert SELECT die von einer Abfrage zurückgegebene Menge von Spalten.
- Siehe auch:
Syntax¶
In den folgenden Abschnitten wird die Syntax dieses Befehls beschrieben:
Auswählen aller Spalten¶
[ ... ]
SELECT [ { ALL | DISTINCT } ]
[ TOP <n> ]
[{<object_name>|<alias>}.]*
[ ILIKE '<pattern>' ]
[ EXCLUDE
{
<col_name> | ( <col_name>, <col_name>, ... )
}
]
[ REPLACE
{
( <expr> AS <col_name> [ , <expr> AS <col_name>, ... ] )
}
]
[ RENAME
{
<col_name> AS <col_alias>
| ( <col_name> AS <col_alias>, <col_name> AS <col_alias>, ... )
}
]
Sie können nach SELECT * die folgenden Kombinationen von Schlüsselwörtern angeben. Die Schlüsselwörter müssen in der unten angegebene Reihenfolge sein:
SELECT * ILIKE ... REPLACE ...
SELECT * ILIKE ... RENAME ...
SELECT * ILIKE ... REPLACE ... RENAME ...
SELECT * EXCLUDE ... REPLACE ...
SELECT * EXCLUDE ... RENAME ...
SELECT * EXCLUDE ... REPLACE ... RENAME ...
SELECT * REPLACE ... RENAME ...
Auswählen bestimmter Spalten¶
[ ... ]
SELECT [ { ALL | DISTINCT } ]
[ TOP <n> ]
{
[{<object_name>|<alias>}.]<col_name>
| [{<object_name>|<alias>}.]$<col_position>
| <expr>
}
[ [ AS ] <col_alias> ]
[ , ... ]
[ ... ]
Weitere Informationen zu SELECT als Anweisung und zu den anderen Klauseln in dieser Anweisung finden Sie unter Abfragesyntax.
Parameter¶
ALL | DISTINCT
Gibt an, ob im Resultset Duplikate entfernt werden sollen:
ALL
schließt alle Werte in das Resultset ein.DISTINCT
entfernt doppelte Werte aus dem Resultset.
Standard:
ALL
TOP n
Gibt die maximale Anzahl der zurückzugebenden Ergebnisse an. Siehe TOP <n>.
object_name
oder .alias
Gibt den Objektbezeichner oder den Objektalias an, wie in der FROM-Klausel definiert.
*
Das Sternchen ist eine Abkürzung, um anzugeben, dass die Ausgabe alle Spalten des angegebenen Objekts oder alle Spalten aller Objekte enthalten soll, wenn
*
nicht mit einem Objektnamen oder Alias qualifiziert ist.Wenn Sie
*
angeben, können Sie auchILIKE
,EXCLUDE
,REPLACE
undRENAME
angeben:ILIKE 'pattern'
Gibt an, dass nur die Spalten, die mit
pattern
übereinstimmen, in den Ergebnissen enthalten sein sollen.In
pattern
können Sie die folgenden SQL-Platzhalter verwenden:Verwenden Sie einen Unterstrich (
_
), um eine Übereinstimmung mit einem beliebigen einzelnen Zeichen anzugeben.Verwenden Sie ein Prozentzeichen (
%
), um eine Übereinstimmung mit einer beliebigen Sequenz von null oder mehr Zeichen anzugeben.
Um eine Übereinstimmung mit einer Sequenz an einer bestimmten Stelle in einer Zeichenfolge anzugeben, beginnen und beenden Sie das Muster mit
%
.Beim Abgleichen wird nicht zwischen Groß- und Kleinschreibung unterschieden.
Wenn keine Spalten mit dem angegebenen Muster übereinstimmen, tritt ein Kompilierungsfehler auf (
001080 (42601): ... SELECT with no columns
).EXCLUDE col_name
.EXCLUDE (col_name, col_name, ...)
Gibt die Spalten an, die von den Ergebnissen ausgeschlossen werden sollen.
Wenn Sie eine Auswahl aus mehreren Tabellen vornehmen, verwenden Sie
SELECT table_name.*
, um anzugeben, dass Sie alle Spalten einer bestimmten Tabelle auswählen möchten. Den nicht qualifizierten Spaltennamen geben Sie dann inEXCLUDE
an. Beispiel:SELECT table_a.* EXCLUDE column_in_table_a , table_b.* EXCLUDE column_in_table_b ...
REPLACE (expr AS col_name [ , expr AS col_name, ...] )
Ersetzt den Wert von
col_name
durch den Wert des ausgewerteten Ausdrucksexpr
.Um beispielsweise die Zeichenfolge
'DEPT-'
den Werten in der Spaltedepartment_id
voranzustellen, verwenden Sie:SELECT REPLACE ('DEPT-' || department_id AS department_id) ...
col_name
:Die Spalte muss existieren und kann nicht durch
ILIKE
oderEXCEPT
herausgefiltert werden.Sie können die gleiche Spalte nicht mehrmals in der Liste der Ersetzungen angeben.
Wenn die Spalte in mehreren Tabellen enthalten ist (z. B. in beiden Tabellen einer Verknüpfung), schlägt die Anweisung mit einem „ambiguous column“-Fehler (mehrdeutige Spalte) fehl.
expr
muss einen einzelnen Wert ergeben.RENAME col_name AS col_alias
.RENAME (col_name AS col_alias, col_name AS col_alias, ...)
Gibt die Spalten-Aliasse an, die in den Ergebnissen verwendet werden sollen.
Wenn Sie eine Auswahl aus mehreren Tabellen vornehmen, verwenden Sie
SELECT table_name.*
, um anzugeben, dass Sie alle Spalten einer bestimmten Tabelle auswählen möchten. Den nicht qualifizierten Spaltennamen geben Sie dann inRENAME
an. Beispiel:SELECT table_a.* RENAME column_in_table_a AS col_alias_a, table_b.* RENAME column_in_table_b AS col_alias_b ...
Bemerkung
Wenn Sie nach
SELECT *
eine Kombination von Schlüsselwörtern angeben:Sie können nicht gleichzeitig
ILIKE
undEXCLUDE
angeben.Wenn Sie
EXCLUDE
mitRENAME
oderREPLACE
angeben:Sie müssen
EXCLUDE
vorRENAME
oderREPLACE
angegeben:SELECT * EXCLUDE col_a RENAME col_b AS alias_b ...
SELECT * EXCLUDE employee_id REPLACE ('DEPT-' || department_id AS department_id) ...
Es kann nicht die gleiche Spalte in
EXCLUDE
undRENAME
angegeben werden.
Wenn Sie
ILIKE
mitRENAME
oderREPLACE
angeben, müssen Sie zuerstILIKE
angeben:SELECT * ILIKE '%id%' RENAME department_id AS department ...
SELECT * ILIKE '%id%' REPLACE ('DEPT-' || department_id AS department_id) ...
Wenn Sie
REPLACE
undRENAME
angeben:Sie müssen zuerst
REPLACE
angegeben:SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME employee_id as employee ...
Sie können denselben Spaltennamen in
REPLACE
und inRENAME
angeben:SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME department_id as department ...
col_name
Gibt den Spaltenbezeichner an, wie in der FROM-Klausel definiert.
$col_position
Gibt die Position der Spalte (1-basiert) an, wie in der FROM-Klausel definiert. Wenn eine Spalte aus einer Tabelle referenziert wird, darf diese Anzahl die maximale Anzahl von Spalten in der Tabelle nicht überschreiten.
expr
Gibt einen Ausdruck an, beispielsweise einen mathematischen Ausdruck, der für eine bestimmte Zeile einen bestimmten Wert ergibt.
[ AS ] col_alias
Gibt den Spaltenalias an, der dem resultierenden Ausdruck zugewiesen ist. Dieser wird als Anzeigename in einer SELECT-Liste der obersten Ebene und als Spaltenname in einer Inline-Ansicht verwendet.
Weisen Sie keinen Spaltenalias zu, der mit dem Namen einer anderen Spalte, auf die in der Abfrage verwiesen wird, identisch ist. Wenn Sie beispielsweise Spalten mit den Namen
prod_id
undproduct_id
auswählen, dürfen Sie fürprod_id
nicht den Aliasproduct_id
verwenden. Siehe Fehlerfall: Angeben eines Alias, der mit einem anderen Spaltennamen übereinstimmt.
Verwenden der FOR UPDATE-Klausel¶
Sperren Sie mit der optionalen FOR UPDATE-Klausel die Ergebnisse für künftige Aktualisierungen.
SELECT ...
FROM ...
[ ... ]
FOR UPDATE [ NOWAIT | WAIT <wait_time> ]
Parameter¶
WAIT
Eine Ganzzahl gibt die maximale Dauer (in Sekunden) an, die diese Anweisung auf den Erwerb von Sperren wartet.
Nutzungshinweise¶
FOR UPDATE
muss die letzte Klausel in derSELECT
-Anweisung sein.FOR UPDATE
kann nicht in einer Unterabfrage verwendet werden.NOWAIT
ist die Standardoption, wennNOWAIT
oderWAIT
nicht angegeben ist.FOR UPDATE
-Klausel ist mit den folgenden Features nicht kompatibel:Verwendung von mehreren Tabellen.
Bemerkung
Da Hybridtabellen die Isolationsebene READ COMMITTED
unterstützen, können FOR UPDATE
-Klauseln keine Lesestabilität garantieren.
Eine Tabelle
T
mit nur einer SpalteID
beginnt mit zwei Tupeln: 5 und 10.SELECT * FROM T WHERE ID < 20 FOR UPDATE
in TransaktionT1
würde zwei Tupel 5 und 10 zurückgeben und diese sperren.DELETE FROM T WHERE ID = 5
aus einer anderen TransaktionT2
muss warten, bisT1
abgeschlossen ist (Commit oder Rollback).
Allerdings kann
INSERT INTO T VALUES 12
in einer weiteren TransaktionT3
abgeschlossen werden, und ein nachfolgendesSELECT * FROM T WHERE ID < 20
inT1
wird drei Tupel sehen: 5, 10 und 12.
Nutzungshinweise¶
Aliasnamen und Bezeichner unterscheiden standardmäßig nicht zwischen Groß- und Kleinschreibung. Um die Groß-/Kleinschreibung zu erhalten, schließen Sie diese in Anführungszeichen (
"
) ein. Weitere Informationen dazu finden Sie unter Objektbezeichner.Ohne eine ORDER BY-Klausel sind die von SELECT zurückgegebenen Ergebnisse eine ungeordnete Menge. Wenn Sie die gleiche Abfrage wiederholt für dieselben Tabellen ausführen, kann dies jedes Mal zu einer anderen Ausgabereihenfolge führen. Wenn die Reihenfolge von Belang ist, verwenden Sie die
ORDER BY
-Klausel.SELECT kann nicht nur als unabhängige Anweisung verwendet werden, sondern auch als Klausel in anderen Anweisungen, z. B.
INSERT INTO ... SELECT ...;
. SELECT kann auch in einer Unterabfrage innerhalb einer Anweisung verwendet werden.Wenn Sie einen Spaltenalias für einen Ausdruck (z. B.
expr AS col_alias
) in anderen Teilen derselben Abfrage (in JOIN, FROM, WHERE, GROUP BY, anderen Spaltenausdrücken usw.) verwenden, wird der Ausdruck in vielen Fällen nur einmal ausgewertet.Beachten Sie jedoch, dass der Ausdruck in einigen Fällen mehrfach ausgewertet werden kann, was zu unterschiedlichen Werten für den in verschiedenen Teilen derselben Abfrage verwendeten Alias führen kann.
Beispiele¶
Nachfolgend finden Sie ein paar einfache Beispiele.
Viele Beispiele sind in anderen Teilen der Dokumentation enthalten, einschließlich der detaillierten Beschreibung von Abfragesyntax.
Beispiele für das Abfragen einer Ereignistabelle (deren Schema von Snowflake vordefiniert ist) finden Sie unter Zugriff auf protokollierte Meldungsdaten und Zugriff auf Ablaufverfolgungsdaten.
Einrichten der Daten für die Beispiele¶
Einige der Abfragen unten verwenden folgende Tabellen und Daten:
CREATE TABLE employee_table ( employee_ID INTEGER, last_name VARCHAR, first_name VARCHAR, department_ID INTEGER ); CREATE TABLE department_table ( department_ID INTEGER, department_name VARCHAR );INSERT INTO employee_table (employee_ID, last_name, first_name, department_ID) VALUES (101, 'Montgomery', 'Pat', 1), (102, 'Levine', 'Terry', 2), (103, 'Comstock', 'Dana', 2); INSERT INTO department_table (department_ID, department_name) VALUES (1, 'Engineering'), (2, 'Customer Support'), (3, 'Finance');
Beispiele für das Auswählen aller Spalten (SELECT *)¶
Auswählen aller Spalten mit Namen, die mit einem Muster übereinstimmen
Auswählen aller Spalten mit Namen, die mit einem Muster übereinstimmen, und Umbenennen einer Spalte
Auswählen aller Spalten, Ausschließen einer Spalte und Umbenennen mehrerer Spalten
Auswählen aller Spalten, Ersetzen des Werts einer Spalte und Umbenennen der Spalte
Auswählen aller Spalten aus mehreren Tabellen, Ausschließen einer Spalte und Umbenennen einer Spalte
Auswählen aller Spalten in der Tabelle¶
In diesem Beispiel wird gezeigt, wie alle Spalten in employee_table
auswählt werden:
SELECT * FROM employee_table;
+-------------+------------+------------+---------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME | DEPARTMENT_ID |
|-------------+------------+------------+---------------|
| 101 | Montgomery | Pat | 1 |
| 102 | Levine | Terry | 2 |
| 103 | Comstock | Dana | 2 |
+-------------+------------+------------+---------------+
Auswählen aller Spalten mit Namen, die mit einem Muster übereinstimmen¶
In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table
auswählen, deren Namen id
enthalten:
SELECT * ILIKE '%id%' FROM employee_table;
+-------------+---------------+
| EMPLOYEE_ID | DEPARTMENT_ID |
|-------------+---------------|
| 101 | 1 |
| 102 | 2 |
| 103 | 2 |
+-------------+---------------+
Auswählen aller Spalten bis auf eine Spalte¶
In diesem Beispiel wird gezeigt, wie alle Spalten in employee_table
mit Ausnahme der Spalte department_id
ausgewählt werden:
SELECT * EXCLUDE department_id FROM employee_table;
+-------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME |
|-------------+------------+------------|
| 101 | Montgomery | Pat |
| 102 | Levine | Terry |
| 103 | Comstock | Dana |
+-------------+------------+------------+
Auswählen aller Spalten bis auf zwei oder mehr Spalten¶
In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table
mit Ausnahme der Spalten department_id
und employee_id
auswählen:
SELECT * EXCLUDE (department_id, employee_id) FROM employee_table;
+------------+------------+
| LAST_NAME | FIRST_NAME |
|------------+------------|
| Montgomery | Pat |
| Levine | Terry |
| Comstock | Dana |
+------------+------------+
Auswählen aller Spalten und Umbenennen einer Spalte¶
In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table
auswählen und die Spalte department_id
umbenennen:
SELECT * RENAME department_id AS department FROM employee_table;
+-------------+------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME | DEPARTMENT |
|-------------+------------+------------+------------|
| 101 | Montgomery | Pat | 1 |
| 102 | Levine | Terry | 2 |
| 103 | Comstock | Dana | 2 |
+-------------+------------+------------+------------+
Auswählen aller Spalten und Umbenennen mehrerer Spalten¶
In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table
auswählen und die Spalten department_id
und employee_id
umbenennen:
SELECT * RENAME (department_id AS department, employee_id AS id) FROM employee_table;
+-----+------------+------------+------------+
| ID | LAST_NAME | FIRST_NAME | DEPARTMENT |
|-----+------------+------------+------------|
| 101 | Montgomery | Pat | 1 |
| 102 | Levine | Terry | 2 |
| 103 | Comstock | Dana | 2 |
+-----+------------+------------+------------+
Auswählen aller Spalten, Ausschließen einer Spalte und Umbenennen mehrerer Spalten¶
In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table
auswählen, die Spalte first_name
aber ausschließen und die Spalten department_id
und employee_id
umbenennen:
SELECT * EXCLUDE first_name RENAME (department_id AS department, employee_id AS id) FROM employee_table;
+-----+------------+------------+
| ID | LAST_NAME | DEPARTMENT |
|-----+------------+------------|
| 101 | Montgomery | 1 |
| 102 | Levine | 2 |
| 103 | Comstock | 2 |
+-----+------------+------------+
Auswählen aller Spalten mit Namen, die mit einem Muster übereinstimmen, und Umbenennen einer Spalte¶
In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table
auswählen, deren Namen id
enthalten, und wie Sie die Spalte department_id
umbenennen:
SELECT * ILIKE '%id%' RENAME department_id AS department FROM employee_table;
+-------------+------------+
| EMPLOYEE_ID | DEPARTMENT |
|-------------+------------|
| 101 | 1 |
| 102 | 2 |
| 103 | 2 |
+-------------+------------+
Auswählen aller Spalten und Ersetzen des Werts einer Spalte¶
Dieses Beispiel zeigt, wie Sie alle Spalten in employee_table
auswählen und den Wert in der Spalte department_id
durch den Wert ID mit vorangestelltem DEPT-
ersetzen:
SELECT * REPLACE ('DEPT-' || department_id AS department_id) FROM employee_table;
+-------------+------------+------------+---------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME | DEPARTMENT_ID |
|-------------+------------+------------+---------------|
| 101 | Montgomery | Pat | DEPT-1 |
| 102 | Levine | Terry | DEPT-2 |
| 103 | Comstock | Dana | DEPT-2 |
+-------------+------------+------------+---------------+
Auswählen aller Spalten, Ersetzen des Werts einer Spalte und Umbenennen der Spalte¶
Dieses Beispiel zeigt, wie Sie alle Spalten in employee_table
auswählen, den Wert in der Spalte department_id
durch den Wert ID mit vorangestelltem DEPT-
ersetzen und die Spalte umbenennen:
SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME department_id AS department FROM employee_table;
+-------------+------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME | DEPARTMENT |
|-------------+------------+------------+------------|
| 101 | Montgomery | Pat | DEPT-1 |
| 102 | Levine | Terry | DEPT-2 |
| 103 | Comstock | Dana | DEPT-2 |
+-------------+------------+------------+------------+
Auswählen aller Spalten mit Namen, die mit einem Muster übereinstimmen, und Ersetzen des Wertes in einer Spalte¶
Dieses Beispiel zeigt, wie Sie alle Spalten in employee_table
auswählen, deren Namen id
enthalten, und wie Sie den Werten in der Spalte department_id
die Zeichenfolge DEPT-
voranstellen:
SELECT * ILIKE '%id%' REPLACE('DEPT-' || department_id AS department_id) FROM employee_table;
+-------------+---------------+
| EMPLOYEE_ID | DEPARTMENT_ID |
|-------------+---------------|
| 101 | DEPT-1 |
| 102 | DEPT-2 |
| 103 | DEPT-2 |
+-------------+---------------+
Auswählen aller Spalten aus mehreren Tabellen, Ausschließen einer Spalte und Umbenennen einer Spalte¶
In diesem Beispiel werden zwei Tabellen verknüpft und alle Spalten aus beiden Tabellen ausgewählt, bis auf eine Spalte aus employee_table
. Im Beispiel wird auch eine der aus department_table
ausgewählten Spalten umbenannt.
SELECT
employee_table.* EXCLUDE department_id,
department_table.* RENAME department_name AS department
FROM employee_table INNER JOIN department_table
ON employee_table.department_id = department_table.department_id
ORDER BY department, last_name, first_name;
+-------------+------------+------------+---------------+------------------+
| EMPLOYEE_ID | LAST_NAME | FIRST_NAME | DEPARTMENT_ID | DEPARTMENT |
|-------------+------------+------------+---------------+------------------|
| 103 | Comstock | Dana | 2 | Customer Support |
| 102 | Levine | Terry | 2 | Customer Support |
| 101 | Montgomery | Pat | 1 | Engineering |
+-------------+------------+------------+---------------+------------------+
Beispiele für das Auswählen bestimmter Spalten (SELECT <Spaltenname>)¶
Auswählen mehrerer Spalten nach Namen aus verknüpften Tabellen
Fehlerfall: Angeben eines Alias, der mit einem anderen Spaltennamen übereinstimmt
Auswählen einer einzelnen Spalte nach Name¶
Dieses Beispiel zeigt, wie Sie nach dem Nachnamen eines Mitarbeiters suchen können, wenn Sie die ID kennen.
SELECT last_name FROM employee_table WHERE employee_ID = 101; +------------+ | LAST_NAME | |------------| | Montgomery | +------------+
Auswählen mehrerer Spalten nach Namen aus verknüpften Tabellen¶
In diesem Beispiel werden alle Mitarbeiter mit dem Namen der Abteilung aufgelistet, in der sie tätig sind. Die Reihenfolge bei der Ausgabe erfolgt nach Abteilungsnamen, und innerhalb der einzelnen Abteilung nach Namen der Mitarbeiter. Diese Abfrage verwendet eine Verknüpfung (Join), um die Informationen einer Tabelle mit den Informationen einer anderen Tabelle zu verknüpfen.
SELECT department_name, last_name, first_name FROM employee_table INNER JOIN department_table ON employee_table.department_ID = department_table.department_ID ORDER BY department_name, last_name, first_name; +------------------+------------+------------+ | DEPARTMENT_NAME | LAST_NAME | FIRST_NAME | |------------------+------------+------------| | Customer Support | Comstock | Dana | | Customer Support | Levine | Terry | | Engineering | Montgomery | Pat | +------------------+------------+------------+
Auswählen einer Spalte nach Position¶
Dieses Beispiel zeigt, wie Sie mithilfe von $
eine Spalte statt über den Spaltennamen mit der Spaltennummer identifizieren:
SELECT $2 FROM employee_table ORDER BY $2; +------------+ | $2 | |------------| | Comstock | | Levine | | Montgomery | +------------+
Angeben eines Alias für eine Spalte in der Ausgabe¶
Dieses Beispiel zeigt, dass die Ausgabespalten nicht direkt aus den Tabellen in der FROM
-Klausel entnommen werden müssen. Die Ausgabespalten können allgemeine Ausdrücke sein. Dieses Beispiel berechnet die Fläche eines Kreises mit dem Radius 2.0. Dieses Beispiel zeigt auch, wie Sie einen Spaltenalias verwenden, damit die Ausgabe einen aussagekräftigen Spaltennamen hat:
SELECT pi() * 2.0 * 2.0 AS area_of_circle; +----------------+ | AREA_OF_CIRCLE | |----------------| | 12.566370614 | +----------------+
Fehlerfall: Angeben eines Alias, der mit einem anderen Spaltennamen übereinstimmt¶
Dieses Beispiel zeigt, warum es nicht empfehlenswert ist, einen Spaltenalias zu verwenden, der mit dem Namen einer anderen in der Abfrage verwendeten Spalte übereinstimmt. Diese GROUP BY-Abfrage führt zu einem SQL-Compilerfehler, nicht zu einem Fehler aufgrund von mehrdeutigen Spalten. Der Alias prod_id
, der product_id
in table1
zugewiesen wird, entspricht dem Namen der Spalte prod_id
in table2
. Die einfachste Lösung für diesen Fehler besteht darin, der Spalte einen anderen Alias zu geben.
CREATE OR REPLACE TABLE table1 (product_id NUMBER);
CREATE OR REPLACE TABLE table2 (prod_id NUMBER);
SELECT t1.product_id AS prod_id, t2.prod_id
FROM table1 AS t1 JOIN table2 AS t2
ON t1.product_id=t2.prod_id
GROUP BY prod_id, t2.prod_id;
001104 (42601): SQL compilation error: error line 1 at position 7
'T1.PRODUCT_ID' in select clause is neither an aggregate nor in the group by clause.