2017-07-16 2 views
0

J'ai essayé de chercher ceci, mais je n'ai aucune idée de comment l'exprimer correctement, donc j'espère que quelqu'un ici pourrait être en mesure d'aider.SQL Server: combiner daterange et la liste des codes de produit

J'ai deux tables, produit et daterange.

CREATE TABLE product 
(
    Code varchar(50) NOT NULL, 
    Price money 
); 

CREATE TABLE daterange 
(
    yyyymm varchar(6) NOT NULL 
); 

INSERT INTO product (Code, Price) 
VALUES ('10001J',3.68), ('10002K',7.23), ('10003L',4.72); 

INSERT INTO daterange (yyyymm) 
VALUES (201507),(201508),(201509),(201510); 

La liste que je veux produire est ceci:

YYYYMM Product 
--------------- 
201507 10001J 
201507 10002K 
201507 10003L 
201508 10001J 
201508 10002K 
201508 10003L 
201509 10001J 
201509 10002K 
201509 10003L 
201510 10001J 
201510 10002K 
201510 10003L 

Fondamentalement, créer une combinaison de tous les produits et toutes les dates. Je n'ai aucune idée si j'ai même besoin de la table Daterange, ou si cela peut être fait avec du code seul. Et oui, je pourrais créer la combinaison dans Excel ou autre chose, mais j'espère la construire dans une requête dynamique plus grande.

Merci à l'avance :)

+0

Que diriez-vous d'un 'CROSS JOIN'? –

+0

Et maintenant je me sens comme un idiot. Merci Félix. Je n'ai pas rencontré celui-là avant :) –

+0

'Je n'ai aucune idée si j'ai même besoin de la table de Daterange' À cet égard, une table de dates n'est pas une mauvaise chose à avoir en main, IMO (bien que avec des dates réelles , pas varchars - il est facile de les convertir pour vos besoins plus tard). Vous pouvez ensuite sélectionner la plage de dates dont vous avez besoin dans cette table sans avoir à la créer à chaque fois. La même chose avec une table de nombres. – ZLK

Répondre

0

Merci à Felix pour remarquer un join je n'avais pas vraiment utilisé auparavant.

SELECT yyyymm, code FROM product CROSS JOIN daterange 

a travaillé un charme.

+0

En fait, vous avez déjà _have_ utilisé cela auparavant. Vous pouvez également utiliser 'INNER JOIN' sans une clause' ON' (essayez-le). –

+0

@TimBiegeleisen Une jointure interne aurait toujours besoin d'une clause on. C'est juste la clause on pourrait être «ON 1 = 1» ou quelque chose. – ZLK

+0

@ZLK Dans MySQL, une jointure interne sans clause on est autorisée et est identique à une jointure croisée. Apparemment pas en TSQL. –