Внутреннее объединение трех столов кажется неправильным - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу внутренне объединить три таблицы с условием.
Одно условие - DAT.STATE_ID IN ('7', '8', '9').
Количество равно 116 с запросом ниже.

select count(*) from "B_TRACE"."P_TC_DATA" DAT WHERE DAT."STATE_ID" IN ('7','8','9');

Однако число увеличивается до 146. В результате объединения трех таблиц с запросом ниже.
Число счетчиков должно быть меньше 116. Кажется, это неправильно.
Что не так с внутренним запросом объединения?

SELECT DAT.*, SUBID.*, TR.* 
FROM "B_TRACE"."P_TC_DATA" AS DAT, 
    "B_CC"."CC_CONSENT_RECORD" AS SUBID, 
    "B_TRACE"."P_TC_RECORD" AS TR
WHERE TR."P_SERIAL_ID" = SUBID."SUBJECT_ID" 
    AND TR."P_SERIAL_ID" = DAT."P_SERIAL_ID" 
    AND  (DAT."STATE_ID" IN ('7','8','9')) 
    AND (SUBID."SUBJECT_C_ID" IS NOT NULL)

Еще одна попытка, еще 146 рядов

SELECT DATS.*, SUBID.*, TR.* 
FROM (select * from "B_TRACE"."P_TC_DATA" DAT WHERE DAT."STATE_ID" IN ('7','8','9')) AS DATS, 
    "B_CC"."CC_CONSENT_RECORD" AS SUBID, 
    "B_TRACE"."P_TC_RECORD" AS TR
WHERE TR."P_SERIAL_ID" = SUBID."SUBJECT_ID" 
    AND TR."P_SERIAL_ID" = DATS."P_SERIAL_ID"  
    AND (SUBID."SUBJECT_C_ID" IS NOT NULL)

некоторые попытки

--got 379 rows
SELECT  SUBID.*, TR.* 
FROM  
    "B_CC"."CC_CONSENT_RECORD" AS SUBID, 
    "B_TRACE"."P_TC_RECORD" AS TR
WHERE TR."P_SERIAL_ID" = SUBID."SUBJECT_ID" 


--got 91 rows
SELECT DATS.*, SUBID.* 
FROM (SELECT * FROM "B_TRACE"."P_TC_DATA" DAT WHERE DAT."STATE_ID" IN ('7','8','9')) AS DATS, 
    "B_CC"."CC_CONSENT_RECORD" AS SUBID,    
WHERE SUBID."SUBJECT_ID"=DATS."P_SERIAL_ID" 


--got 181 rows  
SELECT DATS.*, TR.* 
FROM (SELECT * FROM "B_TRACE"."P_TC_DATA" DAT WHERE DAT."STATE_ID" IN ('7','8','9')) AS DATS,  
    "B_TRACE"."P_TC_RECORD" AS TR
WHERE TR."P_SERIAL_ID" = DATS."P_SERIAL_ID"

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Возможно, в CC_CONSENT_RECORD есть дубликат SUBJECT_ID.Таким образом, для каждого дубликата он добавляется к счетчику при присоединении к P_TC_DATA.

Вы можете проверить это

SELECT CONS.SUBJECT_ID, COUNT(*)
FROM B_TRACE.P_TC_DATA AS DATA
JOIN B_CC.CC_CONSENT_RECORD AS CONS 
  ON CONS.SUBJECT_ID = DATA.P_SERIAL_ID
WHERE DATA.STATE_ID IN ('7', '8', '9')
GROUP BY CONS.SUBJECT_ID
HAVING COUNT(*) > 1

А вот альтернатива для запроса

SELECT DATA.*, CONS.*, REC.* 
FROM B_TRACE.P_TC_DATA AS DATA
JOIN B_CC.CC_CONSENT_RECORD AS CONS 
  ON (CONS.SUBJECT_ID = DATA.P_SERIAL_ID AND CONS.SUBJECT_C_ID IS NOT NULL)
LEFT JOIN B_TRACE.P_TC_RECORD AS REC 
  ON REC.P_SERIAL_ID = DATA.P_SERIAL_ID
WHERE DATA.STATE_ID IN ('7', '8', '9')
0 голосов
/ 28 ноября 2018

Попробуйте, как показано ниже: явное соединение

    SELECT DAT.*, SUBID.*, TR.* 
    FROM "B_TRACE"."P_TC_RECORD" AS TR join
    "B_CC"."CC_CONSENT_RECORD" AS SUBID on TR."P_SERIAL_ID" = SUBID."SUBJECT_ID"
    join "B_TRACE"."P_TC_DATA" AS DAT on TR."P_SERIAL_ID" = DAT."P_SERIAL_ID"
     where
     AND  DAT."STATE_ID" IN ('7','8','9')
     AND SUBID."SUBJECT_C_ID" IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...