Mehr

MapInfo, SQL-Daten aus mehreren Tab-Dateien mit denselben Spalten

MapInfo, SQL-Daten aus mehreren Tab-Dateien mit denselben Spalten


Neu im GIS-Forum, entschuldigen Sie sich also im Voraus für mögliche Etikette-Fehler…

Ich arbeite in MapInfo. Ich habe mehrere Tabellen mit der gleichen Struktur. Eine meiner Spalten ist der Rohrdurchmesser. Ich möchte eine SQL-Auswahl für einen bestimmten Rohrdurchmesser oder einen bestimmten Durchmesserbereich durchführen, dh 5 m <= x <= 10 m über alle Tabellen hinweg. Ist das möglich?

Ich kann dies für eine Tabelle tun und die Daten in einer neuen Tabellendatei speichern, dies dann mit einem Mapbasic-Skript wiederholen, aber dann habe ich viele einzelne Tabellen. Ich könnte dies tun und dann zwischen den Registerkarten kopieren und einfügen, aber die Daten sind sehr groß, so dass dies zeitaufwändig ist. Ist es mit dem SQL-Tool möglich, Daten aus einer bestimmten Spalte auszuwählen, die in mehreren Tabellen wiederholt vorkommt, und eine Gruppenauswahl über mehrere Tabellen hinweg zu erstellen, die in einer einzigen Tabelle gespeichert werden kann?

Fühlen Sie sich frei, Fragen zu stellen


in sql kannst du so etwas schreiben:

SELECT * FROM x wobei pipedn >= 5 AND pipedn <= 10

oder

SELECT * FROM table x WHERE Pipedn BETWEEN 5 AND 10

Diese Beispiele zeigen die Verwendung von WHERE

Wenn alle Ihre Tabellen gleich sind, können Sie Folgendes tun:

SELECT col1, col2 aus x UNION ALL SELECT col1 , col2 aus Tabelle y

dieser wählt zwei Tabellen x und y aus und erstellt eine Ergebnismenge, Sie können diese auch in eine neue Tabelle AUSWÄHLEN, die dann die x- und y-Tabelle enthält

siehe: http://msdn.microsoft.com/en-us/library/ms180026.aspx

Sie können eine neue Tabelle all_data erstellen

CREATE TABLE all_data AS (SELECT id , Daten von x UNION ALL SELECT id, weitere Daten als Daten von y)

zum Beispiel scheint http://www.techonthenet.com/sql/index.php ein recht gutes Tutorial für grundlegende SQL-Befehle zu haben

edit: Du kannst sowas auch machen

SELECT * from table_data x wobei x.col1 > 3

table_data x erstellt den Alias ​​x für den Tabellennamen table_data, sodass Sie zwischen den Abfragen nur den Tabellennamen ändern müssen. Wie das in MapInfo geht, weiß ich nicht. Oben ist nur einfaches SQL


Sehen Sie sich die Oracle-Dokumentation an:

Sie können eine Registerkarte in Oracle generieren, indem Sie den ASCII-Wert 9 der Registerkarte und die chr-Funktion verwenden:

Wie Justin in seinem Link betonte, spart die Verwendung des SQLPlus-Befehls set colsep function die Eingabe eines Trennzeichens für jede Spalte.

Aber für tabulatorgetrennt funktioniert set colsep Chr(9) nicht.

Verwenden Sie für UNIX oder LINUX set colsep ' ', wobei das Leerzeichen zwischen den einfachen Anführungszeichen ein getippter Tabulator ist.

Verwenden Sie für Windows diese Einstellungen:

Ein bestimmtes Skript, das ich mehr als einmal gestohlen habe, stammt aus einem AskTom-Thread zum Extrahieren von Daten in eine Flatfile. Wenn ich eine schnelle und schmutzige Flatfile aus SQL*Plus bräuchte. Ich würde jedoch dazu neigen, die DUMP_CSV-Funktion zu bevorzugen, die Tom zuvor in diesem Thread für jede Art von fortlaufendem Prozess gepostet hat.

Ich habe eine dumme Lösung. Es hat sehr gut funktioniert.


Numerischer SQL-Datentyp

SQLDie genauen numerischen Datentypen von bestehen aus NUMERISCH(p,s) und DEZIMAL(p,s) Untertypen. Sie sind exakt, und wir definieren sie durch Präzision (p) und Maßstab (s). Precision ist eine ganze Zahl, die die Gesamtzahl der in dieser Spalte zulässigen Ziffern darstellt. Diese Ziffern befinden sich in einer bestimmten Basis oder Zahlenbasis – d. h. binär (Basis-2) oder dezimal (Basis 10). Sie werden normalerweise mit a . definiert Dezimal Punkt. Die Skala, ebenfalls ein ganzzahliger Wert, repräsentiert die Anzahl der Dezimal setzt links (wenn positiv) oder rechts (wenn negativ wird dies selten verwendet) des Dezimal Punkt.

Schauen wir uns ein Beispiel an. Angenommen, Sie haben eine ‶ balance ”-Spalte als NUMERISCH mit einer Genauigkeit von 8 und einer Skala von 2 definiert.

Die DDL würde so aussehen:

In der Spalte ‶ Saldo ” kann die Zahl 173226.62 sicher gespeichert werden.

P stellt die Gesamtzahl aller Ziffern dar und S steht für die zwei Nachkommastellen.

Es gibt einen kleinen Unterschied zwischen dem numerischen SQL-Datentyp NUMERIC(p,s) und DECIMAL(p,s). NUMERIC bestimmt die exakte Präzision und Skalierung. DECIMAL spezifiziert nur der genaue Maßstab die Genauigkeit ist gleich oder größer als die vom Codierer angegebene. DECIMAL-Spalten können eine größere als die angegebene Genauigkeit aufweisen, wenn dies für das Datenbanksystem bequemer oder effizienter ist.

Mit anderen Worten, DECIMAL gibt Ihnen einen gewissen Spielraum.

Denk daran, dass Finanzdaten wie Kontostände müssen als NUMERIC oder DECIMAL Datentypen gespeichert werden.

Beachten Sie auch, dass viele Top-Datenbankverwaltungssysteme herstellerspezifische Darstellungen numerischer Typen haben (z. B. den NUMBER-Datentyp von Oracle). Diese Implementierungen unterscheiden normalerweise nicht zwischen den Typen NUMERIC und DECIMAL. (In Oracle sind beide vom Typ NUMBER).


2 Antworten 2

Die Werte in der Spalte coltype der Systemkatalogtabelle syscolumns werden hauptsächlich im Informix ESQL/C-Header sqltypes.h definiert. Dieser Header wird im gesamten Informix-Servercode verwendet.

Die Werte in der Spalte coltype sind eine Mischung aus einer 8-Bit-Ganzzahl (ohne Vorzeichen) in den niederwertigen Bits und verschiedenen Flagwerten in den höherwertigen Bits. Insbesondere wenn eine Spalte mit dem NOT NULL-Qualifizierer definiert wird, wird das 0x100-Bit gesetzt – was „Add 256“ entspricht. Es gibt andere Flag-Bits, die Sie mit geringerer Wahrscheinlichkeit sehen.

Der in einer anderen Antwort angezeigte Wert 4118 (dezimal) entspricht hex 0x1016, 16 (auch bekannt als 22 dezimal) entspricht SQLROW und das 0x1000 (4096 dezimal) Bit entspricht #define SQLNAMED 0x1000 /* Benannter Zeilentyp vs. Zeilentyp */ . Der Typ ist (wie in der anderen Antwort angegeben) ein "benannter Zeilentyp".

Die Werte in der sqltype-Spalte von syscolumns sind:

Diese entsprechen SQLUDTFIXED (Typ 41). Der Typ SQLBOOL ist mit "von FE verwendet" gekennzeichnet [Vorderes Ende], … keine wirklichen Haupttypen in BE [Backend, also Datenbankserver]'. Die Collength ist für beide 1.

Zu den relevanten Segmenten des Headers gehören:

Es gibt auch 'C-ISAM-Typen' mit den Nummern 100 bis 125 und Namen wie CCHARTYPE und CDECIMALTYPE . Sie sind hier nicht von unmittelbarem Interesse. Die Header-Datei enthält 524 Zeilen (zumindest in der Version, die ich mir angesehen habe). Davon sind 74 leer, 315 enthalten Code und die restlichen Zeilen sind reine Kommentarzeilen. AFAIK, der SQLREFSER8-Typ ist tot, er existiert außerhalb dieser Datei nicht.

Die Typen BLOB NOT NULL und CLOB NOT NULL sind beide in coltype als 297 (41 + 256 — das gleiche ein BOOLEAN NOT NULL ) oder SQLUDTFIXED mit einer Spaltenlänge von 72 (im Gegensatz zu 1 für BOOLEAN NOT NULL ) codiert. Die Daten fester Länge sind ein Deskriptor, der alle Details darüber liefert, wo der BLOB- oder CLOB-Wert tatsächlich gespeichert wird.


4 Antworten 4

Dies ist bei einer korrelierten Unterabfrage relativ trivial. Sie können die in dem von Ihnen erwähnten Blogbeitrag hervorgehobene COALESCE-Methode nicht verwenden, es sei denn, Sie extrahieren diese in eine benutzerdefinierte Funktion (oder wenn Sie jeweils nur eine Zeile zurückgeben möchten). So mache ich das normalerweise:

Wenn Sie einen Fall haben, in dem die Daten in Kommentaren für XML unsichere Zeichen ( > , < , & ) enthalten könnten, sollten Sie dies ändern:

Zu diesem aufwendigeren Ansatz:

(Stellen Sie sicher, dass Sie den richtigen Zieldatentyp, varchar oder nvarchar , und die richtige Länge verwenden, und stellen Sie allen Zeichenfolgenliteralen ein N voran, wenn Sie nvarchar verwenden.)

Wenn Sie CLR in Ihrer Umgebung verwenden dürfen, ist dies ein maßgeschneiderter Fall für ein benutzerdefiniertes Aggregat.

Dies ist insbesondere dann wahrscheinlich der richtige Weg, wenn die Quelldaten nicht trivial groß sind und/oder Sie diese Art von Dingen in Ihrer Anwendung häufig tun müssen. Ich vermute stark, dass der Abfrageplan für Aarons Lösung nicht gut skaliert, wenn die Eingabegröße wächst. (Ich habe versucht, der temporären Tabelle einen Index hinzuzufügen, aber das hat nicht geholfen.)

Diese Lösung ist, wie viele andere Dinge, ein Kompromiss:

  • Richtlinien/Richtlinien für die Verwendung der CLR-Integration in Ihrer oder der Umgebung Ihres Kunden.
  • Die CLR-Funktion ist wahrscheinlich schneller und skaliert bei einem realen Datensatz besser.
  • Die CLR-Funktion kann in anderen Abfragen wiederverwendet werden, und Sie müssen nicht jedes Mal eine komplexe Unterabfrage duplizieren (und debuggen), wenn Sie diese Art von Vorgang ausführen müssen.
  • Straight T-SQL ist einfacher als das Schreiben und Verwalten eines externen Codes.
  • Vielleicht wissen Sie nicht, wie man in C# oder VB programmiert.
  • etc.

BEARBEITEN: Nun, ich habe versucht zu sehen, ob dies tatsächlich besser ist, und es stellte sich heraus, dass die Anforderung, dass die Kommentare in einer bestimmten Reihenfolge vorliegen, derzeit nicht mit einer Aggregatfunktion erfüllt werden kann. :(

Siehe SqlUserDefinedAggregateAttribute.IsInvariantToOrder. Grundsätzlich müssen Sie OVER(PARTITION BY customer_code ORDER BY row_num) tun, aber ORDER BY wird bei der Aggregation in der OVER-Klausel nicht unterstützt. Ich gehe davon aus, dass das Hinzufügen dieser Funktionalität zu SQL Server eine Dose Würmer öffnet, da das, was im Ausführungsplan geändert werden müsste, trivial ist. Der oben genannte Link besagt, dass dies für die zukünftige Verwendung reserviert ist, sodass dies in Zukunft implementiert werden könnte (bei 2005 haben Sie jedoch wahrscheinlich kein Glück).

Dies könnten immer noch durch Packen und Parsen des row_num-Werts in die aggregierte Zeichenfolge und anschließendes Sortieren innerhalb des CLR-Objekts. was ziemlich hackig erscheint.

Auf jeden Fall ist unten der Code, den ich verwendet habe, falls jemand anderes dies trotz der Einschränkung nützlich findet. Ich überlasse den Hacking-Teil als Übung für den Leser. Beachten Sie, dass ich AdventureWorks (2005) für Testdaten verwendet habe.

T-SQL zum Testen ( CREATE ASSEMBLY und sp_configure zum Aktivieren von CLR weggelassen):


SQL-Syntax

Eine Datenbank enthält meistens eine oder mehrere Tabellen. Jede Tabelle wird durch einen Namen identifiziert (z. B. „Kunden“ oder „Bestellungen“). Tabellen enthalten Datensätze (Zeilen) mit Daten.

In diesem Tutorial verwenden wir die bekannte Northwind-Beispieldatenbank (in MS Access und MS SQL Server enthalten).

Nachfolgend eine Auswahl aus der Tabelle "Kunden":

Die obige Tabelle enthält fünf Datensätze (einen für jeden Kunden) und sieben Spalten (Kundennummer, Kundenname, Kontaktname, Adresse, Stadt, Postleitzahl und Land).


Exportformate und Komprimierungsarten

BigQuery unterstützt die folgenden Datenformate und Komprimierungstypen für exportierte Daten.

Sie können das CSV-Trennzeichen in Ihren exportierten Daten steuern, indem Sie das Flag --field_delimiter bq des Befehlszeilentools oder die Eigenschaft configuration.extract.fieldDelimiter Extraktjob verwenden.

Verschachtelte und wiederholte Daten werden nicht unterstützt.

GZIP wird für Avro-Exporte nicht unterstützt.

Verschachtelte und wiederholte Daten werden unterstützt. Siehe Avro-Exportdetails.

GZIP wird für Parkett-Exporte nicht unterstützt.

Verschachtelte und wiederholte Daten werden unterstützt. Siehe Details zum Parkettexport.


Zugehörige Hinweise:

Stellen Sie sicher, dass der neueste Report RSDU_TABLE_CONSISTENCY auf dem ABAP-System implementiert ist.
SAP-Hinweis 2025271 RSHDB: RSDU_TABLE_CONSISTENCY NW7.30 SP13
SAP-Hinweis 2150645 - RSDU_TABLE_CONSISTENCY: Round-Robin-Partitionierung für Infocubes hat falsche Serveranzahl (Pilotnote)
SAP-Hinweis 1937062 Verwendung von RSDU_TABLE_CONSISTENCY
SAP-Hinweis 2043632 - Tabellenklassifizierung fehlt oder ist falsch, wenn ein VNB angelegt, kopiert oder geändert wird

Betonung auf den folgenden beiden Tabellen

  1. CL_SCEN_PARTITION_SPEC - Überprüfen Sie die Partitionsspezifikation von Tabellen
    1. ich. Die Partitionsspezifikation wird in TABLES unter PARTITION_SPEC gespeichert
    2. CL_SCEN_TAB_CLASSIFICATION - Prüftabellen sind richtig klassifiziert
      1. ich. Gruppentypen, Untertypen und Gruppennamen werden in TABLE_GROUPS gespeichert
      1. Tabellenreorganisation fehlgeschlagen
        SAP-Hinweis 2093572 - SAP HANA-Migration von Multi-Node zu Single-Node
      1. REORG_OVERVIEW - Bietet Informationen über die neuesten ausgeführten Algorithmen wie Neuverteilung, Optimierung, Status und den Tag, an dem sie ausgeführt wurden.
        1. ich. ALGORITHM_ID-Definitionen:

        1 Tabellen nach dem Hinzufügen von Hosts neu verteilen

        6 Tabellenverteilung optimieren

        7 Optimieren Sie die Tabellenpartitionierung

        1. REORG_PLAN - vorgeschlagener Plan für die Landschaftsverteilung mit Details wie neue und alte Partitionsspezifikation, neuer und alter Host und Ports für jede Tabelle. Nützlich, um zu untersuchen, welche Änderungen kürzlich an der Verteilung vorgenommen wurden.
          1. ich. Beachten Sie, dass diese Tabelle temporär ist. Um eine Kopie des Plans vom Kunden zu erhalten
          2. REORG_STEPS - Schritte, die für die Tabellenumverteilung geplant oder ausgeführt wurden. Es enthält neben den Einträgen in REORG_PLAN auch Angaben zu Status, Fehlermeldungen sowie Start- und Endzeiten.
              1. Erstellen Sie einen neuen Reorg-Plan: "CALL REORG_GENERATE(<ALGORITHM_ID>, <PARAMETER>)"
              2. Wählen Sie * aus REORG_PLAN
                  1. Rechtsklick -> Ergebnis exportieren -> Speichern
                  1. Dynamisches Tiering
                    SAP-Hinweis: 1767880 - Inaktives Datenkonzept für BW auf SAP HANA DB
                    SAP-Hinweis 2140959 - SAP HANA Dynamic Tiering - zusätzliche Informationen
                  1. Das Erhöhen der Trace-Level für den Indexserver kann Aufschluss darüber geben, warum Änderungen durch den Reorganisationsalgorithmus vorgenommen wurden
                  1. indexsever.ini

                  SELECT * FROM M_TABLE_LOCATIONS WHERE SCHEMA_NAME = '<SCHEMA>' AND TABLE_NAME = '<TABLE>'

                  SELECT * FROM M_TABLE_PERSISTENCE_LOCATIONS WHERE SCHEMA_NAME = '<SCHEMA>' AND TABLE_NAME = '<TABLE>'

                  SELECT * FROM M_CS_TABLES WHERE SCHEMA_NAME = '<SCHEMA>' AND TABLE_NAME = '<TABLE>'

                  SELECT * FROM M_CS_COLUMNS WHERE SCHEMA_NAME = '<SCHEMA>' AND TABLE_NAME = '<TABLE>'

                  SELECT * FROM M_TABLE_PERSISTENCE_STATISTICS WHERE SCHEMA_NAME = '<SCHEMA>' AND TABLE_NAME = '<TABLE>'

                  SELECT * FROM M_TABLE_VIRTUAL_FILES WHERE SCHEMA_NAME = '<SCHEMA>' AND TABLE_NAME = '<TABLE>'
                  SELECT * FROM M_TABLE_LOB_FILES WHERE SCHEMA_NAME = '<SCHEMA>' AND TABLE_NAME = '<TABLE>'

                  SQL-Skripte aus SAP-Hinweis 1969700 - Sammlung von SQL-Anweisungen für SAP HANA

                  SQL: "HANA_Tables_PartitionedTables" um partitionierte Tabellen aufzulisten

                  SQL: "HANA_Tables_Partitions" um einzelne Partitionen einer oder mehrerer Tabellen aufzulisten

                  SQL: "HANA_Tables_ColumnStore_TableHostMapping" um die Partitionsverteilung von Tabellen über Knoten in einem Scale-Out-Szenario anzuzeigen


                  Das Verschieben der TempDB-Dateien erfolgt in zwei Schritten:

                  1. Sagen Sie SQL wo Sie möchten, dass Ihre neuen TempDB-Dateien zu gehen
                  2. Neustart den SQL Server-Dienst, damit die Änderung wirksam wird

                  Um SQL mitzuteilen, wo die neuen TempDB-Dateien erstellt werden sollen, können Sie Folgendes verwenden:

                  Dadurch werden die T-SQL-Anweisungen generiert, die Sie ausführen müssen, um die Dateien in das gewünschte neue Laufwerk:Ordner zu verschieben. (zum Vergrößern auf das Bild klicken)

                  Wenn Sie Ihre Umzugsanweisungen ausgeführt haben, können Sie die obige Abfrage erneut ausführen, um zu überprüfen, ob die Spalte Aktueller Standort jetzt Ihr neues Laufwerk:Ordner anzeigt.

                  Wenn Sie mit Ihren Änderungen zufrieden sind, Starten Sie den SQL Server-Dienst neu.


                  3 Antworten 3

                  Sie fragen nach dem, was wir in der SQL Server-Welt einen "Clustered-Index" nennen. Der Clustered-Index ist die Daten. D.h. der B-Baum für den Index sind Ihre tatsächlichen Tabellendaten.

                  Ein gruppierter Index hat nicht das Konzept der eingeschlossenen Spalten, da sich alle Spalten im gruppierten Index befinden – der gruppierte Index sind die Daten. Sie haben also die Schlüsselspalten (die Sie verwenden, um die Abfrage zu steuern, wie sozusagen die WHERE-Klausel) und der Rest der Spalten befindet sich im Blatt.

                  Sie können sich die Nicht-Schlüsselspalten in einem gruppierten Index genauso vorstellen wie eingeschlossene Spalten in einem nicht gruppierten Index.

                  Verwechseln Sie den PK nicht mit dem Clustered-Index. Sie entscheiden, ob der PK mit einem Clustered-Index oder einem Non-Clustered-Index geliefert werden soll.

                  Möglicherweise haben Sie einen besseren Kandidaten für den Clustered-Index als den PK. Bußgeld! Machen Sie einfach den PK nicht gruppiert und erstellen Sie den gruppierten Index für diesen besseren Kandidaten.

                  Wie Tibor in seiner Antwort beschreibt, suchen Sie nach einem Clustered-Index mit einem breiten Schlüssel. Wenn Sie nur diesen Index benötigen, erledigt dieser die Aufgabe genau so, wie Sie es möchten, ohne dass zusätzlicher Speicherplatz benötigt wird.