Suite

MapInfo, données SQL de plusieurs fichiers d'onglets qui ont les mêmes colonnes


Nouveau sur le forum SIG, nous nous excusons d'avance pour tout manquement potentiel à l'étiquette…

Je travaille dans MapInfo. J'ai plusieurs tables avec la même structure. L'une de mes colonnes est le diamètre du tuyau. Je voudrais faire une sélection SQL pour un diamètre de tuyau ou une plage de diamètres particulier, c'est-à-dire 5 m <= x <= 10 m sur toutes les tables. Est-ce possible?

Je suis capable de le faire pour une table et d'enregistrer les données dans un nouveau fichier de table, puis de le refaire à l'aide d'un script Mapbasic, mais je me retrouve alors avec de nombreuses tables individuelles. Je pourrais le faire, puis copier et coller entre les onglets, mais les données sont très volumineuses, ce qui prend du temps. À l'aide de l'outil SQL, est-il possible de sélectionner les données d'une colonne particulière qui se reproduisent dans plusieurs tables et de créer une sélection de groupe sur plusieurs tables pouvant être enregistrées dans une seule table ?

N'hésitez pas à poser des questions


en SQL, vous pouvez écrire quelque chose comme ceci :

SELECT * FROM x où pipedn >= 5 AND pipedn <= 10

ou alors

SELECT * FROM table x WHERE pipedn ENTRE 5 ET 10

ces exemples montrent comment utiliser WHERE

si toutes vos tables sont identiques, vous pouvez faire :

SELECT col1, col2 de x UNION ALL SELECT col1 , col2 de la table y

celui-ci sélectionne deux tables x et y et crée un ensemble de résultats, vous pouvez également SELECTIONNER dans cette nouvelle table qui contient alors les tables x et y

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

Vous pouvez créer une nouvelle table all_data

CREATE TABLE all_data AS (SELECT id , données de x UNION ALL SELECT id, moredata comme données de y)

par exemple http://www.techonthenet.com/sql/index.php semble avoir un assez bon tutoriel pour les commandes SQL de base

edit : tu peux faire quelque chose comme ça aussi

SELECT * à partir de table_data x où x.col1 > 3

table_data x crée l'alias x pour le nom de la table table_data, donc la seule chose que vous devez changer entre les requêtes est le nom de la table. Comment faire cela dans MapInfo, je ne sais pas. Ci-dessus est juste un simple SQL


Consultez la documentation Oracle :

Vous pouvez générer un onglet dans Oracle en utilisant la valeur ASCII 9 de l'onglet et la fonction chr :

Comme Justin l'a souligné dans son lien, l'utilisation de la commande SQLPlus de la fonction set colsep évite de taper un séparateur pour chaque colonne.

Mais pour délimité par des tabulations, set colsep Chr(9) ne fonctionnera pas.

Pour UNIX ou LINUX, utilisez set colsep ' ' avec l'espace entre les guillemets simples étant une tabulation typée.

Pour Windows, utilisez ces paramètres :

Un script particulier que j'ai volé à plusieurs reprises provient d'un fil de discussion AskTom sur l'extraction de données dans un fichier plat. Si j'avais besoin d'un fichier plat rapide et sale à partir de SQL*Plus. J'aurais tendance à préférer la fonction DUMP_CSV que Tom a publiée plus tôt sur ce fil pour tout type de processus en cours, cependant.

J'ai une solution stupide. Cela a très bien fonctionné.


Type de données numériques SQL

SQLLes types de données numériques exacts de se composent de NUMÉRIQUE(p,s) et DÉCIMAL(p,s) sous-types. Ils sont exacts, et nous les définissons par précision (p) et échelle (s). La précision est un entier qui représente le nombre total de chiffres autorisés dans cette colonne. Ces chiffres sont dans une base particulière, ou base numérique, c'est-à-dire binaire (base-2) ou décimale (base-10). Ils sont généralement définis par un décimal indiquer. L'échelle, également une valeur entière, représente le nombre de décimal des endroits à gauche (si positif) ou à droite (si négatif, c'est rarement utilisé) du décimal indiquer.

Regardons un exemple. Supposons que vous ayez défini une colonne balance ” comme NUMERIC avec une précision de 8 et une échelle de 2.

Le DDL ressemblerait à ceci :

La colonne « solde » peut stocker en toute sécurité le nombre 173226.62.

P représente le nombre total de tous les chiffres et s représente les deux chiffres après la virgule.

Il existe une petite différence entre les types de données numériques SQL NUMERIC(p,s) et DECIMAL(p,s). NUMERIQUE détermine le précision et échelle exactes. DECIMAL spécifie seulement l'échelle exacte la précision est égale ou supérieure à ce qui est spécifié par le codeur. Les colonnes DECIMAL peuvent avoir une précision supérieure à celle spécifiée si cela est plus pratique ou efficace pour le système de base de données.

En d'autres termes, DECIMAL vous laisse une certaine marge de manœuvre.

Garde en tête que données financières comme les soldes de comptes doivent être stockés en tant que types de données NUMERIC ou DECIMAL.

Sachez également que de nombreux systèmes de gestion de bases de données de premier plan ont des représentations spécifiques aux fournisseurs de types numériques (par exemple, le type de données NUMBER d'Oracle). Ces implémentations ne font généralement pas de différence entre les types NUMERIC et DECIMAL. (Dans Oracle, les deux sont du type NUMBER).


2 réponses 2

Les valeurs de la colonne coltype de la table du catalogue système syscolumns sont définies principalement dans l'en-tête Informix ESQL/C sqltypes.h . Cet en-tête est utilisé dans tout le code du serveur Informix.

Les valeurs de la colonne coltype sont un mélange d'un entier de 8 bits (non signé) dans les bits de poids faible et de diverses valeurs d'indicateur dans les bits de poids fort. En particulier, lorsqu'une colonne est définie avec le qualificateur NOT NULL, le bit 0x100 est défini, ce qui correspond à « ajouter 256 ». Il y a d'autres bits de drapeau que vous êtes moins susceptible de voir.

La valeur 4118 (décimale) affichée dans une autre réponse correspond à l'hex 0x1016 le 16 (aka 22 décimal) correspond à SQLROW , et le bit 0x1000 (4096 décimal) correspond à #define SQLNAMED 0x1000 /* Type de ligne nommé vs type de ligne */ . Le type est (comme indiqué dans l'autre réponse) un "type de ligne nommé".

Les valeurs de la colonne sqltype de syscolumns sont :

Ceux-ci correspondent à SQLUDTFIXED (type 41). Le type SQLBOOL est marqué 'utilisé par FE [l'extrémité avant], … pas de vrais types majeurs en BE [back end, signifiant serveur de base de données]'. La longueur de col est 1 pour les deux.

Les segments pertinents de l'en-tête incluent :

Il existe également des « types C-ISAM » avec les numéros 100 à 125 et des noms tels que CCHARTYPE et CDECIMALTYPE . Ils ne sont pas une préoccupation immédiate ici. Il y a 524 lignes dans le fichier d'en-tête (au moins dans la version que j'ai consultée). Parmi celles-ci, 74 sont vides, 315 contiennent du code et les lignes restantes sont de pures lignes de commentaires. AFAIK, le type SQLREFSER8 est mort-né il n'existe pas en dehors de ce fichier.

Les types BLOB NOT NULL et CLOB NOT NULL sont tous deux codés dans coltype comme 297 (41 + 256 — le même qu'un BOOLEAN NOT NULL ), ou SQLUDTFIXED avec une longueur de col de 72 (par opposition à 1 pour BOOLEAN NOT NULL ). Les données de longueur fixe sont un descripteur qui fournit tous les détails sur l'endroit où la valeur BLOB ou CLOB est réellement stockée.


4 réponses 4

C'est relativement trivial à faire avec une sous-requête corrélée. Vous ne pouvez pas utiliser la méthode COALESCE mise en évidence dans l'article de blog que vous mentionnez à moins de l'extraire vers une fonction définie par l'utilisateur (ou à moins que vous ne souhaitiez renvoyer une ligne à la fois). Voici comment je procède généralement :

Si vous avez un cas où les données dans les commentaires peuvent contenir des caractères non sécurisés pour XML ( > , < , & ), vous devez modifier ceci :

A cette approche plus élaborée :

(Assurez-vous d'utiliser le bon type de données de destination, varchar ou nvarchar , et la bonne longueur, et préfixez tous les littéraux de chaîne avec N si vous utilisez nvarchar .)

Si vous êtes autorisé à utiliser CLR dans votre environnement, il s'agit d'un cas sur mesure pour un agrégat défini par l'utilisateur.

En particulier, c'est probablement la voie à suivre si les données source ne sont pas trivialement volumineuses et/ou si vous devez faire ce type de chose beaucoup dans votre application. Je soupçonne fortement que le plan de requête pour la solution d'Aaron ne s'adaptera pas bien à mesure que la taille de l'entrée augmente. (J'ai essayé d'ajouter un index à la table temporaire, mais cela n'a pas aidé.)

Cette solution, comme beaucoup d'autres choses, est un compromis :

  • Politique/politique pour même utiliser l'intégration CLR dans votre environnement ou celui de votre client.
  • La fonction CLR est probablement plus rapide et s'adaptera mieux à un ensemble réel de données.
  • La fonction CLR sera réutilisable dans d'autres requêtes, et vous n'aurez pas à dupliquer (et déboguer) une sous-requête complexe à chaque fois que vous aurez besoin de faire ce type de chose.
  • Straight T-SQL est plus simple que d'écrire et de gérer un morceau de code externe.
  • Peut-être que vous ne savez pas programmer en C# ou VB.
  • etc.

ÉDITER: Eh bien, je suis allé essayer de voir si c'était réellement mieux, et il s'avère que l'exigence que les commentaires soient dans un ordre spécifique n'est actuellement pas possible à satisfaire à l'aide d'une fonction d'agrégation. :(

Voir SqlUserDefinedAggregateAttribute.IsInvariantToOrder. Fondamentalement, ce que vous devez faire est OVER(PARTITION BY code_client ORDER BY num_ligne) mais ORDER BY n'est pas pris en charge dans la clause OVER lors de l'agrégation. Je suppose que l'ajout de cette fonctionnalité à SQL Server ouvre une boîte de vers, car ce qui devrait être modifié dans le plan d'exécution est trivial. Le lien susmentionné indique que cela est réservé à une utilisation future, donc cela pourrait être implémenté à l'avenir (en 2005, vous n'avez probablement pas de chance, cependant).

Ce pouvait toujours être accompli en compressant et en analysant la valeur row_num dans la chaîne agrégée, puis en effectuant le tri dans l'objet CLR. ce qui semble assez hackish.

Dans tous les cas, vous trouverez ci-dessous le code que j'ai utilisé au cas où quelqu'un d'autre trouverait cela utile même avec la limitation. Je laisserai la partie hacking comme exercice pour le lecteur. Notez que j'ai utilisé AdventureWorks (2005) pour les données de test.

T-SQL pour les tests ( CREATE ASSEMBLY et sp_configure pour activer le CLR omis) :


Syntaxe SQL

Une base de données contient le plus souvent une ou plusieurs tables. Chaque table est identifiée par un nom (par exemple "Clients" ou "Commandes"). Les tableaux contiennent des enregistrements (lignes) avec des données.

Dans ce didacticiel, nous utiliserons la célèbre base de données exemple Northwind (incluse dans MS Access et MS SQL Server).

Vous trouverez ci-dessous une sélection du tableau « Clients » :

Le tableau ci-dessus contient cinq enregistrements (un pour chaque client) et sept colonnes (CustomerID, CustomerName, ContactName, Address, City, PostalCode et Country).


Formats d'exportation et types de compression

BigQuery est compatible avec les formats de données et les types de compression suivants pour les données exportées.

Vous pouvez contrôler le délimiteur CSV dans vos données exportées à l'aide de l'indicateur d'outil de ligne de commande --field_delimiter bq ou de la propriété de tâche d'extraction configuration.extract.fieldDelimiter.

Les données imbriquées et répétées ne sont pas prises en charge.

GZIP n'est pas pris en charge pour les exportations Avro.

Les données imbriquées et répétées sont prises en charge. Voir les détails de l'exportation Avro.

GZIP n'est pas pris en charge pour les exportations Parquet.

Les données imbriquées et répétées sont prises en charge. Voir les détails de l'exportation de parquet.


Remarques associées :

Assurez-vous que le dernier rapport RSDU_TABLE_CONSISTENCY est implémenté sur le système ABAP.
Note SAP 2025271 RSHDB : RSDU_TABLE_CONSISTENCY NW7.30 SP13
Note SAP 2150645 - RSDU_TABLE_CONSISTENCY : le partitionnement Round Robin pour les infocubes a un nombre incorrect de serveurs (note pilote)
Note SAP 1937062 Utilisation de RSDU_TABLE_CONSISTENCY
Note SAP 2043632 - Classification de table manquante ou erronée, lors de la création, de la copie ou de la modification d'un DSO

Accent sur les deux tableaux suivants

  1. CL_SCEN_PARTITION_SPEC - Vérifier la spécification de partition des tables
    1. je. La spécification de partition est stockée dans TABLES sous PARTITION_SPEC
    2. CL_SCEN_TAB_CLASSIFICATION - Vérifier que les tables sont correctement classées
      1. je. Les types de groupes, les sous-types et les noms de groupes sont stockés dans TABLE_GROUPS
      1. Échec de la réorganisation de la table
        Note SAP 2093572 - Migration SAP HANA de plusieurs nœuds vers un seul nœud
      1. REORG_OVERVIEW - Fournit des informations sur les derniers algorithmes exécutés, tels que la redistribution, l'optimisation, l'état et le jour où ils l'ont exécuté.
        1. je. Définitions ALGORITHM_ID :

        1 Redistribuer les tables après l'ajout d'hôte(s)

        6 Optimiser la répartition des tables

        7 Optimiser le partitionnement des tables

        1. REORG_PLAN - plan proposé pour la distribution du paysage avec des détails tels que les nouvelles et anciennes spécifications de partition, les nouveaux et anciens hôtes et ports pour chaque table. Utile pour enquêter sur les modifications apportées récemment à la distribution.
          1. je. Notez que cette table est temporaire. Pour recevoir une copie du plan du client
          2. REORG_STEPS - étapes qui doivent être exécutées ou qui ont été exécutées pour la redistribution de la table. Outre les entrées dans REORG_PLAN, il contient également des détails sur l'état, les messages d'erreur et les heures de début et de fin.
              1. Créer un nouveau plan de réorganisation : "CALL REORG_GENERATE(<ALGORITHM_ID>, <PARAMETER>)"
              2. Sélectionnez * dans REORG_PLAN
                  1. Clic droit -> Exporter le résultat -> Enregistrer
                  1. Hiérarchisation dynamique
                    Remarque SAP : 1767880 - Concept de données non actif pour BW sur SAP HANA DB
                    Note SAP 2140959 - Hiérarchisation dynamique SAP HANA - informations supplémentaires
                  1. L'augmentation des niveaux de trace pour le serveur d'indexation peut donner un aperçu des raisons pour lesquelles l'algorithme de réorganisation a été modifié
                  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>'

                  Scripts SQL de SAP Note 1969700 - Collection d'instructions SQL pour SAP HANA

                  SQL : "HANA_Tables_PartitionedTables" pour lister les tables partitionnées

                  SQL : "HANA_Tables_Partitions" pour lister les partitions individuelles d'une ou plusieurs tables

                  SQL : "HANA_Tables_ColumnStore_TableHostMapping" pour afficher la répartition des partitions des tables sur les nœuds dans un scénario de montée en charge


                  Le déplacement des fichiers TempDB est un processus en 2 étapes :

                  1. Dites SQL vous voulez que vos nouveaux fichiers TempDB aillent à
                  2. Redémarrage le service SQL Server pour que la modification prenne effet

                  Pour indiquer à SQL où créer les nouveaux fichiers TempDB, vous pouvez utiliser :

                  Cela générera les instructions T-SQL que vous devez exécuter pour déplacer les fichiers vers le nouveau lecteur :dossier souhaité. (cliquez sur l'image pour l'agrandir)

                  Lorsque vous avez exécuté vos instructions de déplacement, vous pouvez exécuter à nouveau la requête ci-dessus pour vérifier que la colonne Emplacement actuel affiche maintenant votre nouveau lecteur:dossier .

                  Une fois que vous êtes satisfait de vos modifications, redémarrer le service SQL Server.


                  3 réponses 3

                  Ce que vous demandez est ce que nous appelons un "index cluster" dans le monde SQL Server. L'index clusterisé est les données. C'est-à-dire que le b-tree de l'index correspond aux données réelles de votre table.

                  Un index cluster n'a pas le concept de colonnes incluses puisque toutes les colonnes sont dans l'index cluster - l'index cluster étant les données. Vous avez donc les colonnes clés (ce que vous utilisez pour "driver la requête", comme la clause WHERE, pour ainsi dire) et le reste des colonnes est dans la feuille.

                  Vous pouvez considérer les colonnes non-clés dans un index clusterisé comme les colonnes incluses dans un index non-cluster.

                  Ne confondez pas la PK avec l'index cluster. Vous décidez si la PK doit être livrée avec un index clusterisé ou un index non clusterisé.

                  Vous pourriez avoir un meilleur candidat pour l'index cluster que le PK. Bien! Il suffit de rendre le PK non clusterisé et de créer l'index clusterisé sur ce meilleur candidat.

                  Comme Tibor le décrit dans sa réponse, ce que vous recherchez est un index clusterisé avec une clé large. Si tout ce dont vous avez besoin est cet index, il fera le travail exactement comme vous le souhaitez, sans stockage supplémentaire.


                  Voir la vidéo: MapInfoDiscover Selecting u0026 Querying Data clip (Octobre 2021).