2008-11-12 9 views
2

Je suis aux prises avec la création d'une requête. C'est lié à une base de données volumineuse et compliquée mais pour le plaisir de ce post, j'ai réduit le problème à quelque chose de plus simple.Problème avec une requête SQL avec un produit cartésien

J'ai trois tableaux X, Y, Z définis comme

CREATE TABLE [dbo].[X](
    [ID] [bigint] NOT NULL 
) 

CREATE TABLE [dbo].[Y](
    [ID] [nchar](10) NOT NULL 
) 

CREATE TABLE [dbo].[Z](
    [IDX] [bigint] NOT NULL, 
    [IDY] [nchar](10) NOT NULL 
) 

Ils contiennent les données suivantes

Table X Table Y Table Z 
ID   ID   IDX IDY 
--   --   --- --- 
1   A   1 A   
2   B   1 B   
3   C   1 A 

Je veux créer une requête qui produit le résultat suivant

Count IDX IDY 
===== === === 
    2 1 A 
    1 1 B 
    0 1 C 
    0 2 A 
    0 2 B 
    0 2 C 
    0 3 A 
    0 3 B 
    0 3 C 

Ma pensée initiale était

SELECT COUNT(*), X.ID, Y.ID 
FROM 
    X 
    CROSS JOIN Y 
    FULL OUTER JOIN Z ON X.ID = Z.IDX AND Y.ID = Z.IDY 
GROUP BY X.ID, Y.ID 

mais cela s'avère être sur la mauvaise route.

Des idées?

Répondre

1
SELECT 
    (SELECT COUNT(*) FROM Z WHERE IDX = X.ID AND IDY = Y.ID), 
    X.ID, 
    Y.ID 
FROM 
    X,Y 

Voilà votre réponse ... pourquoi voulez-vous peut-être cette requête, aucun indice :)

+0

J'aime la simplicité de votre solution. Si vous considérez X comme comtés, Y comme domaines de droit et Z comme cas pénaux, alors l'ensemble de résultats montre le nombre de cas criminels qui appartiennent à un certain domaine de droit et qui ont été enregistrés dans un certain comté. –

+0

Super, je suis content de pouvoir aider :) –

0
SELECT 
    COUNT(z.idx) count, 
    x.id idx, 
    y.id idy 
FROM 
    (x CROSS JOIN y) 
    LEFT JOIN z ON z.idx = x.id AND z.idy = y.id 
GROUP BY 
    x.id, 
    y.id 
ORDER BY 
    COUNT(z.idx) DESC, 
    x.id, 
    y.id 
1

Cela semble fonctionner:

SELECT COUNT(*) AS CNT, IDX, IDY 
FROM Z 
GROUP BY IDX, IDY 
UNION 
SELECT 0, X.ID, Y.ID 
FROM X, Y 
WHERE NOT EXISTS (
    SELECT * FROM Z WHERE Z.IDX = X.ID AND Z.IDY = Y.ID 
) 
ORDER BY CNT DESC 
0
SELECT (SELECT(COUNT(*) FROM Z) AS COUNT, X.ID AS IDX, y.ID AS IDY 
FROM X CROSS JOIN Y 
ORDER BY 1 DESC, 2, 3 
Questions connexes