2010-12-12 68 views
0

En Coldfusion, j'ai deux: sources de données et DWQ PRQ. J'interroge dwq pour un news_id qui sera comparé à la pageid dans prq.CF/SQL et QofQ - Comment joindre les dossiers

<cfquery name="dwq" datasource="cu_dsn"> 
SELECT NEWS_ID 
FROM dw 
</cfquery> 

<cfquery name="prq" datasource="commonspot"> 
SELECT 
    PAGEID, 
     TITLE 
FROM pr 
WHERE (PUBLISH ='Yes' OR PUBLISH=NULL) 
</cfquery> 

<cfquery name="join" dbtype="query"> 
SELECT 
     prq.PAGEID, 
     prq.TITLE 
    dwq.NEWS_ID 
FROM prq, dwq 
where prq.pageid <> dwq.news_id 
</cfquery> 

Ce que je dois faire est de sélectionner tous les enregistrements dans la source de données prq qui ne correspondent pas à news_id. Comme je ne peux pas utiliser JOIN dans QofQ, j'espérais substituer une clause WHERE, mais le SQL retourne un enregistrement plusieurs fois (égal au nombre d'enregistrements dans dwq).

Quelqu'un pourrait-il s'il vous plaît aider à SQL appropriée à utiliser? Je vous remercie!!

Répondre

0

Eh bien, je ne sais pas vraiment quoi que ce soit au sujet des FC ou QofQ, mais dans SQL régulière, pour obtenir tous les enregistrements de PRQ qui ne correspondent pas à un certain news_id que vous utilisez:

SELECT 
    prq.PAGEID, 
    prq.TITLE 
FROM prq 
WHERE prq.pageid <> {dwq.news_id} -- That is, insert the proper news_id here in the correct coldfusiony way 

Si vous voulez pour obtenir toutes les années QEM qui ne correspondent pas dwq.news_id (toutes les pages qui ne sont pas des pages de nouvelles, je suppose), utilisez:

SELECT 
    prq.PAGEID, 
    prq.TITLE 
FROM prq 
WHERE prq.pageid NOT IN (
    SELECT NEWS_ID 
    FROM dwq 
) 

HTH, et bonne chance. Peut-être que j'essaierai de savoir comment faire cela dans les FC plus tard. Assurez-vous de poster quand vous découvrez comment le faire fonctionner!

EDIT: Ah, on y va: si vous voulez faire une boucle sur les news_ids en question 1 et d'obtenir tous les pageids qui ne sont pas que id nouvelles, l'utilisation (peut-être pour une liste de liens vers d'autres articles?):

<cfloop query="dwq"> 
    <cfquery name="prq" datasource="commonspot"> 
     SELECT 
      PAGEID, 
      TITLE 
     FROM pr 
     WHERE (PUBLISH ='Yes' OR PUBLISH=NULL) 
      AND PAGEID <> #dwq.NEWS_ID# 
    </cfquery> 

    <cfdosomethingwithquery query="prq"> 
     ... 
    </cfdosomethingwithquery> 
</cfloop> 

je pense. Cela nécessiterait probablement beaucoup plus de requêtes que nécessaire, cependant.

+0

Salut, Merci pour votre réponse! Malheureusement, CF QofQ n'autorise pas les jointures/except/not in. Et le news_id serait celui listé dans la première source de données, dwq. Toute autre suggestion serait la bienvenue. Merci! – Chris

+0

Eh bien, ne pouvez-vous pas simplement obtenir tous les résultats des deux ensembles de données et faire vos choses conditionnelles hors-liste dans CF au lieu de SQL? Quoi qu'il en soit, je pense que la cavalerie vient d'arriver: @TimDawe semble en savoir beaucoup plus sur ce truc que moi. Bonne chance! ;) –

1

Si les deux tables dw et pr sont tous deux disponibles par le même source de données (votre question suggère qu'ils ne sont pas), alors première approche de Norman est le aiguillat chemin à parcourir.

Sinon, vous pourriez faire quelque chose de similaire en remplaçant votre deuxième requête (PRQ) avec:

<cfquery name="prq" datasource="commonspot"> 
SELECT 
    PAGEID, 
    TITLE 
FROM pr 
WHERE (PUBLISH ='Yes' OR PUBLISH=NULL) 
    AND PAGEID NOT IN (#valuelist(dwq.news_id)#) 
</cfquery> 

Vous ne voudriez pas alors besoin de votre troisième requête (rejoindre). Vous ne savez pas si cela fonctionnera avec un grand nombre de lignes dans dw, et votre SGBD peut avoir une limite sur le nombre d'ID qu'il acceptera dans un IN.

+0

Merci Tim! Cela fonctionne comme je le voulais. Hélas, il y aura une liste toujours croissante d'enregistrements en dw; cependant, il y aura quelques valeurs NULL que j'ai filtré (WHERE news_id n'est pas NULL). Merci beaucoup! – Chris

+1

Vous pouvez faire une jointure en utilisant ColdFusion la requête de requêtes, en utilisant 'DE variableName1, variableName2 OÙ variableName1.x = syntaxe variableName2.x' (vous ne pouvez utiliser INNER JOIN ... ON syntaxe); Cependant, pour voter pour l'ajout de syntaxe OUTER JOIN (entre autres améliorations en glissement trimestriel) vote pour ce bogue/ER: http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=71968 –