union tous avec des requêtes qui ont un nombre différent de colonnes
J'ai couru dans un cas où une requête sqlite et je m'attends à renvoyer un message d'erreur est réellement réussir et je me demandais si quelqu'un pouvait indiquer pourquoi cette requête est valide.
CREATE TABLE test_table(
k INTEGER,
v INTEGER
);
INSERT INTO test_table( k, v ) VALUES( 4, 5 );
SELECT * FROM(
SELECT * FROM(
SELECT k, v FROM test_table WHERE 1 = 0
)
UNION ALL
SELECT * FROM(
SELECT rowid, k, v FROM test_table
)
)
Je pense que la fusion de deux sélectionne qui ont un nombre différent de colonnes renvoyait une erreur. Si je supprime le ultrapériphériques SELECT *
puis-je recevoir le message d'erreur que j'attends: SELECTs to the left and right of UNION ALL do not have the same number of result columns
.
source d'informationauteur user1560123
Vous devez vous connecter pour publier un commentaire.
La réponse à ce qui semble être simple: Oui, c'est un caprice.
Je voudrais illustrer cela avec un court exemple. Mais au préalable, nous allons consulter le la documentation:
Donc les documentations dit très clairement que les deux
SELECTs
doit fournir le même nombre de colonnes. Cependant, comme vous l'avez dit, le ultrapériphériquesSELECT
étrangement évite cette "limitation".Exemple 1
Résultat:
La troisième colonne
rowid
obtient simplement omis, comme indiqué dans les commentaires.Exemple 2
Nous sommes seulement en changeant l'ordre des deux états.
Résultat
Maintenant, sqlite ne pas omettre la colonne, mais d'ajouter une valeur null.
Conclusion
Ce qui m'amène à ma conclusion, que sqlite simplement les poignées de la
UNION ALL
différemment si elle est traitée comme une sous-requête.PS: Si vous êtes juste en utilisant
UNION
il ne parvient pas à n'importe quel scénario.L'UNION de TOUS sera de retour les résultats avec des valeurs null dans les colonnes supplémentaires.
Une base de l'UNION va échouer parce que l'UNION sans que le TOUT est d'avoir le même nombre de colonnes de deux tables.
Donc:
renvoie 3 colonnes avec des valeurs null dans la colonne 3.
et:
échoue, car le nombre de colonnes ne correspondent pas à.
En conclusion, vous pouvez ajouter une colonne vide à l'UNION, de sorte que vous sélectionnez 3 colonnes de chaque table et il fonctionne encore.
EX: