CF / SQL & QofQ - Как объединять записи - PullRequest
0 голосов
/ 13 декабря 2010

В Coldfusion у меня есть два источника данных: dwq и prq. Я запрашиваю dwq для news_id, который будет сравниваться с pageid в prq.

<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>

Что мне нужно сделать, это выбрать все записи в источнике данных prq, которые не соответствуют news_id. Поскольку я не могу использовать JOIN в QofQ, я надеялся заменить предложения WHERE, но SQL возвращает одну запись несколько раз (что равно количеству записей в dwq).

Может ли кто-нибудь помочь с правильным использованием SQL? Спасибо !!

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

Если две таблицы dw и pr доступны через один и тот же источник данных (ваш вопрос говорит о том, что это не так), то первым подходом Spiny Norman является путь.

Если нет, вы можете сделать что-то похожеезаменив второй запрос (prq) на:

<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>

Третий запрос (присоединение) вам не понадобится.Не уверен, насколько хорошо это будет работать с большим количеством строк в dw, и ваша СУБД может иметь ограничение на число идентификаторов, которые она будет принимать в IN.

0 голосов
/ 13 декабря 2010

Ну, я действительно ничего не знаю о CF или QofQ, но в обычном SQL, чтобы получить все записи из prq, которые не соответствуют определенному news_id, вы бы использовали:

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

Если вы хотите получить все prq, которые не соответствуют ни одному dwq.news_id (я думаю, все страницы, которые не являются новостными), используйте:

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

HTH, и удачи. Может быть, я постараюсь выяснить, как сделать это в CF позже. Обязательно отправьте ответ, когда узнаете, как заставить его работать!

РЕДАКТИРОВАТЬ: Ах, здесь мы идем: если вы хотите перебрать news_ids в запросе 1 и получить все страницы, которые не являются этим идентификатором новости (может быть, для списка ссылок на другие элементы?), Используйте:

<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>

Я думаю. Это, вероятно, будет использовать гораздо больше запросов, чем необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...