Выяснение проблем с присоединением SQL - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть две таблицы.клиент (клиент, компания, штат, статус) и SupportTatus (клиент, компания, статус, соглашение).Разве следующий запрос не должен возвращать все компании, которые имеют значение соглашения 0 и чей статус не равен «отключен»?Я запутался, потому что выбираю компанию, объединяю две таблицы по общему коэффициенту (клиенту) и фильтрую результаты запроса.

SELECT cl.company
FROM   clients cl
       INNER JOIN supportstatus su
         ON cl.clientid = su.clientid
WHERE  su.agreement11 = 0
       AND su.status <> 'disabled'
ORDER  BY cl.company  

Источник ColdFusion

<cfquery name="qryPendingAgreement" datasource="support">
SELECT clientid
FROM supportstatus
WHERE agreement11 = 0 AND status <> 'disabled'
</cfquery>

<cfquery name="qryClient" datasource="support">
SELECT     clientid, company, state, serv_billing
FROM         clients
WHERE prod_arth = 1 OR prod_artr = 1 OR prod_epcr_host = 1 OR prod_epcr_remote = 1 OR prod_billing = 1 OR prod_collections = 1
</cfquery>

<cfquery name="qryResults" dbtype="query">
SELECT qryClient.company, qryClient.state, qryClient.serv_billing
FROM qryPendingAgreement, qryClient
WHERE qryPendingAgreement.clientid = qryClient.clientid
order by qryClient.company
</cfquery>

Ответы [ 3 ]

1 голос
/ 08 ноября 2011

Вы не сказали, какие результаты дал вам запрос.Если запрос фильтрует больше строк, чем вы думаете, ответом может быть трехзначная логика.

null != 'disabled' -> null, что не соответствует действительности, и строка фильтруется.

Попробуйте этот фильтр вместо.

WHERE  su.agreement11 = 0
    AND isnull(su.status,'') <> 'disabled'
0 голосов
/ 08 ноября 2011

Это дикое предположение, но если вы используете эту версию:

SELECT cl.company
FROM   clients cl
       INNER JOIN supportstatus su
         ON cl.clientid = su.clientid
WHERE  su.agreement11 = 0
       AND su.status <> 'disabled'
       OR prod_arth = 1      OR prod_artr = 1 
       OR prod_epcr_host = 1 OR prod_epcr_remote = 1 
       OR prod_billing = 1   OR prod_collections = 1
ORDER  BY cl.company 

проблема в приоритете AND, OR.Попробуйте это:

SELECT cl.company
FROM   clients cl
       INNER JOIN supportstatus su
         ON cl.clientid = su.clientid
WHERE  su.agreement11 = 0
       AND su.status <> 'disabled'
       AND ( prod_arth = 1      OR prod_artr = 1 
          OR prod_epcr_host = 1 OR prod_epcr_remote = 1 
          OR prod_billing = 1   OR prod_collections = 1
           )
ORDER  BY cl.company 
0 голосов
/ 08 ноября 2011

Это должно помочь вам проверить ваш запрос.Ваш вопрос не был достаточно конкретным, так что это лучшее, что я могу сделать:)

    DECLARE @client TABLE
    (
      clientid int,
      company VARCHAR(50)
    )
    DECLARE @supportstatus TABLE
    (
      clientid int,
      [status] VARCHAR(50),
      agreement INT
    )

    INSERT INTO @client ([clientid],[company]) VALUES ( 0,'acme' ) 
    INSERT INTO @client ([clientid],[company]) VALUES ( 1,'byron' ) 
    INSERT INTO @client ([clientid],[company]) VALUES ( 2,'cathode' ) 

    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 0, 'disabled',0)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 0, 'disabled',1)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 0, 'somethingelse',0)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 0, 'somethingelse',1)

    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 1, 'disabled',0)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 1, 'disabled',1)
    --INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 1,   'somethingelse',0)
    --INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 1,   'somethingelse',1)

    --INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 2,   'disabled',0)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 2, 'disabled',1)
    --INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 2,   'somethingelse',0)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 2, 'somethingelse',1)

    -- all companies who have su.agreement = 0 and su.status <> 'disabled' 
    SELECT cl.company 
    FROM @client cl 
    JOIN @supportstatus su ON cl.clientid = su.clientid 
    WHERE su.agreement = 0 AND su.status <> 'disabled' 
    Order By cl.company
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...