SQL-Abfrage-Syntax : Mit dem Tabellen-alias count ungültig ist? Warum?
Könnte mir jemand bitte erklären, warum die folgende Abfrage ist ungültig? Ich bin mit dieser Abfrage für eine Oracle 10g Datenbank.
select count(test.*) from my_table test;
Bekomme ich die folgende Fehlermeldung: ORA-01747: Ungültiger Benutzer.Tabelle.Spalte, Tabelle.Spalte oder Spalte Spezifikation
jedoch, die folgenden beiden Abfragen gültig sind.
select count(test.column) from my_table test;
select test.* from my_table test;
- Denn Oracle hat die Lücken in Ihrer Unterstützung für den standard SQL.
MySQL
undSQL Server
nicht unterstützen diese syntax zu.- MySQL unterstützt die syntax (habe es gerade getestet mit der version 5.1.46). Habe ich noch nicht getestet SQL Server.
CREATE TABLE t_count (id INT NOT NULL); SELECT COUNT(t_count.*) FROM t_count;
. Sie haben einen Fehler in Ihrer SQL-syntax; Lesen Sie im Handbuch, das entspricht Ihrer MySQL-server-version für den richtigen syntax in der Nähe '*) VON t_count' at line 1- Karwin:
SELECT COUNT(test.*) FROM MY_TABLE test
schlägt fehl - "Falscher syntax in der Nähe '*'", die auf SQL Server 2005. - Aha, Sie sind richtig. Ich mich zurückziehe, meine Aussage.
- Sind Sie versuchen, um die Anzahl der Datensätze, die mindestens einen nicht-null-Wert in einer Spalte? In Oracle, dies zu tun, müssen Sie so etwas wie
SELECT COUNT(*) FROM my_table WHERE COALESCE(colA, colB, colC, colD, etc) IS NOT NULL
- dies ist normalerweise nicht sinnvoll, da eine Tabelle mit allen SpaltenNULL
in der Lage ist in der Regel die Zeichen für schlechtes design.
Du musst angemeldet sein, um einen Kommentar abzugeben.
COUNT(Ausdruck)
zählt alle Zeilen, in denenexpression
ist nicht null.COUNT(*)
ist eine Ausnahme, es gibt die Anzahl der Zeilen:*
ist nicht ein alias fürmy_table.*
.Soweit ich weiß,
Count(Table.*)
ist nicht offiziell unterstützt, in der SQL-Spezifikation. NurCount(*)
(zählen Sie alle Zeilen zurückgegeben werden) undCount(Table.ColumnName)
(zählt alle nicht-null-Werte in der angegebenen Spalte). Also, auch wenn das DBMS unterstützt, würde ich empfehlen gegen die Verwendung von es.`Diese syntax funktioniert nur in
PostgreSQL
und nur weil es einen record-Datentyp (für dietest.*
ist eine sinnvolle Ausdruck).Verwenden Sie einfach
COUNT(*)
.Diese Abfrage:
werden Sie wieder die Anzahl der Datensätze, für die
test.column
ist nichtNULL
.Diese Abfrage:
wird nur Sie wieder alle Datensätze aus
my_table
.COUNT
als solche ist wahrscheinlich das einzige Aggregat, das macht Sinn, ohne Parameter, und mit einem Ausdruck wieCOUNT(*)
ist nur ein Weg, um eine Funktion aufzurufen, ohne die Angabe von aktualparametern zu.Man vernünftigerweise wollen, finden Sie die Anzahl der Datensätze, in denen test.Spalte ist nicht NULL, wenn Sie einen outer-join. Da jede Tabelle sollte einen PK (die nicht null ist), sollten Sie in der Lage zu zählen, die Zeilen wie, dass, wenn Sie wollen:
COUNT(*) ist nicht gut, weil hier der outer-join ist die Schaffung einer null-Zeile für die Tabelle, ist Mangel an Informationen.