SQL-запрос возвращает разные результаты в двух разных запросах - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь обновить старый запрос SQL, который возвращает 1020 строк данных;новый запрос, однако, возвращает 1864 строки. Я пробовал как левое соединение / внутреннее соединение. Спасибо.

Старый запрос (1020 строк)

select 
    cl.clid as clid_, cl.id as hlid_, holdinNo, 
    holding,ClientID as clientid_, ClientName as clientName_  
from 
    tx_holding as cl 
where 
    cl.status = 1 
    and cl.roadno = '001'
    and cl.id in (select hlid from tx_asset where asset is not null) 
    and cl.clid in (select id from tbl_client where client_type = 'Non-Govt.') 
    and cl.id not in (select hlid from tx_bill_pay 
                      where year(date_month) = 2019 and hlid is not null 
                      group by hlid)

Новый запрос (1864 строки)

select * 
from  
    (select 
         cl.clid, cl.id, cl.holdinNo,  cl.holding,
         cl.ClientID as clientid_, cl.ClientName as clientName_  
     from 
         tx_holding as cl 
     where 
         cl.status = 1 
         and cl.roadno = '001') AS cl
inner join
    (select clid, hlid 
     from tx_asset 
     where asset is not null) as A on Cl.id = A.hlid 
inner join 
    (select cellNo, id 
     from tbl_client 
     where client_type = 'Non-Govt.') as C on cl.clid = C.id
where
    cl.id not in (select hlid
                  from tx_bill_pay
                  where year(date_month) = 2019  
                    and hlid is not null 
                  group by hlid) 

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Если я не ошибаюсь, вам нужна новая итерация вашего запроса, чтобы возвращать те же результаты, что и ваш старый запрос (оба должны быть 1020).

Однако структура вашего нового запросас учетом таблиц, которые ранее не рассматривались как объединение (внутреннее или левое), поэтому у вас может быть случай дублирования данных из-за недостаточной привязки первичного ключа.

1) В исходном запросе вы только просматриваете "tx_holding "и не создает новых объединений. Ваши операторы ограничения ищут данные в разных таблицах, но не присоединяются напрямую к вашей базовой таблице и, поскольку они возвращают одно поле, оператор IN работает нормально.

2) В вашем новом запросе вы толькопривязка одного поля из "tx_asset" к вашей базовой таблице, так что, скорее всего, эта таблица имеет составной первичный ключ (2 или более полей в качестве ключевых полей), поэтому вы получите что-то вроде этого:

TX_HOLDING (CL)
ID
1
2
3
4

TX_ASSET (A)
HLID CLID
1 1
1 2
21
2 2
3 1

Поскольку вы объединяете таблицы только в одном поле (CL.ID = A.HLID), это создает двойственность, поскольку у вас есть 2 записи, которые равны1, но имеют другой вторичный первичный ключ.

Одним из возможных решений будет добавление еще одного оператора ON, связывающего CL.CLID = A.CLID, если эти 2 поля, конечно, соответствуют структуре вашей таблицы;Также учтите, что вы вызываете его в своем подзапросе, но на самом деле не используете его. Это будет распространяться на ваше второе соединение с "tbl_client".

1 голос
/ 10 октября 2019

Это, вероятно, в ваших левых соединениях.

Переход от наличия экземпляра (в предложении) к объединению может сделать это, если объединение возвращает несколько записей одного и того же критерия соединения. Я бы начал с удаления неиспользуемых критериев и добавления отличных от выбора. Если это решит проблему, я удалю distncts по одному, чтобы увидеть, где происходит дублирование. Затем я бы изменил выбор с отдельного на группу. Я также переделал бы предложение where, а не в наборе идентификаторов - ужасный способ фильтрации.

LEFT JOIN
    (
        SELECT DISTINCT hlid
        FROM tx_asset
        WHERE asset IS NOT NULL
    ) AS A
    ON Cl.id = A.hlid

LEFT JOIN
    (
        SELECT DISTINCT id
        FROM tbl_client WHERE client_type = 'Non-Govt.'
    ) AS C
    ON cl.clid=C.id
WHERE cl.id NOT IN
(
    SELECT hlid
    FROM tx_bill_pay
    WHERE
        year(date_month) = 2019 AND
        hlid IS NOT NULL
    GROUP BY hlid
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...