2012-08-22 1 views
1

J'ai une table T1, et je veux obtenir une nouvelle table avec deux fois les lignes: Une colonne supplémentaire qui obtient 0 (pour une copie de T1) et 1 (pour une deuxième copie de T1). En d'autres termes, je veux joindre T1 avec une table constante avec une colonne booléenne et toutes les valeurs possibles.Méthode préférée pour joindre une table avec (0,1)^T?

Quel est le meilleur/le plus efficace/le plus approprié pour faire cela dans MySQL?

Répondre

3

Si vous voulez faire une jointure croisée, vous pouvez le faire:

select t.*, const.which 
from t cross join 
    (select 0 as which union all select 1 as which) const 

Ceci est nettement plus efficace que UNION. Que ce soit plus efficace que UNION ALL dépend du moteur de base de données.

Si "t" est une sous-requête, cela est susceptible d'être plus efficace, car il n'y a aucune chance que la sous-requête soit évaluée plus d'une fois.

+0

[Dans MySQL 'cross join' =' jointure interne 'donc probablement besoin d'utiliser la syntaxe de virgule.] (Http://dev.mysql.com/doc/refman/5.6/fr/join .html) –

+0

@MartinSmith. . . Vous avez raison que cross join = jointure interne. Cependant, l'interpration est mauvaise. Vous pouvez remplacer "cross join" dans la requête ci-dessus par "inner join" et cela fonctionne sans la clause on. Si vous analysez attentivement la documentation des jointures mysql (http://dev.mysql.com/doc/refman/5.0/fr/join.html), vous verrez que la clause "on" est facultative. –

+0

Juste repéré cela aussi bien. Le comportement de MySQL n'est pas aussi bizarre que je le pensais. –

2

Vous voulez dire une union?

select 0 as newfield, * from yourtable 
union all 
select 1, * from yourtable 
+0

Est-ce que le 'comme newfield' pour le' 1' est implicite? Et devriez-vous l'inclure de toute façon? –

+0

Une union prend les noms de champ du premier select. Ça ne fait aucune différence. – podiluska

+2

C'est une bonne réponse. Cependant, il est préférable d'utiliser UNION ALL, il n'y a donc pas d'effort inutile pour essayer de supprimer les doublons. –

Questions connexes