2016-07-19 3 views
0

Ich habe ein Problem mit der Abfrage in mysql. Ich habe 2 Tabellen, Tabellen1 und Tabelle 2 erstellt. In Tabelle1 gibt es 2 Zeilen Daten, die gleichen in Tabelle2, wo es 2 Zeilen Daten und jede Tabelle 3 Felder haben. In diesem Fall möchte ich Ansicht und diese eine Abfrage machen: Man denkeIst es ein Fehler? Oder ein Fehler? Oder eine falsche Abfrage?

create view point as select table2.field2 from table1, table2; 

ich es Daten in table2 zeigen, wo es zwei Reihen Daten haben. Aber das Ergebnis zeigt 4 Zeilen Daten, wobei alle 2 Zeilen die gleichen Daten sind. Wenn ich versuche, 1 Zeile in Tabelle 1 zu löschen, lösche ich 1 Daten, und ich versuche, die Abfrage wie oben einzugeben. Das Ergebnis ist korrekt, es zeigt 2 Zeilen Daten in Tabelle2. Warum ist es richtig, wenn in Tabelle 1 1 Zeile Daten und nicht wenn Tabelle 1 2 Zeilen Daten haben. Bitte, wie man es löst? Oder es ist meine falsche Abfrage.

+0

Sie haben keine Join-Bedingungen in Ihrer 'from' oder' where' Klausel. Im Wesentlichen führen Sie einen kartesischen Join durch, bei dem für jede Zeile in jeder anderen Tabelle in Ihrer 'from'-Klausel eine Zeile angezeigt wird. Was Sie sehen, ist im Wesentlichen 2 Zeilen * 1 Zeilen = 2 Zeilen. 2 Zeilen * 2 Zeilen = 4 Zeilen. Sie müssen eine Join-Bedingung für Ihre Tabellen hinzufügen, beispielsweise einen Primärschlüssel mit einem Fremdschlüssel verknüpfen. – Rook

+0

Vielen Dank. Jetzt weiß ich, wenn Sie die Zählung wie Ihr Beispiel oben zeigen. Aber eigentlich, meine 2 Tische gibt es keine Bedingung zum Verknüpfen. Ich möchte nur einen Wert in tables2 und table1 mit Ergebnis in new view nehmen, wenn es auch ein neues Feld in Sicht ist. Jetzt erinnere ich mich, mit Sicht muss Beziehung zwischen 2 Tabellen oder mehr. Danke Rook. –

Antwort

0

Sie verwenden implicit cross join zwischen diesen beiden Tabellen.

Nehmen wir an, table1 hat m Zeilen und table2 hat n Zeilen.

Dann

SELECT * FROM table1,table2wird m*n Zeilen zurück.

Die obige Abfrage entspricht dies:

SELECT * FROM table1 CROSS JOIN table2.

Wenn Sie alle Zeilen von table1 und table2 erhalten möchten, bedenken Sie, dass ich keine Duplikate benötige, dann müssen Sie UNION verwenden.

So, könnte man für diese Abfrage suchen:

CREATE VIEW point AS 
SELECT table2.field2 from table2 
UNION 
SELECT table1.field2 from table1 

Hinweis:

Wenn Sie doppelte Werte in Ihrem Endergebnis erlauben wollen dann UNION ALL statt UNION wie unten verwenden gesetzt:

CREATE VIEW point AS 
SELECT table2.field2 from table2 
UNION ALL 
SELECT table1.field2 from table1 
+0

Ich habe das versucht, aber Union Merge 2 wählen Sie Methoden, um eine Methode wählen und mehrere Datensatzdaten zu ignorieren. –

+0

ja 'UNION' führt die Ergebnisse aus diesen zwei getrennten Abfragen zusammen, die Duplikate entfernen. Nur für den Fall, dass Duplikate zulässig sind, verwende stattdessen "UNION ALL". – 1000111

Verwandte Themen