присоединитесь к трем таблицам или сделайте вложенный SQL-оператор в Oracle - PullRequest
3 голосов
/ 09 августа 2011

присоединитесь к трем таблицам или сделайте вложенный sql в oracle

У меня есть три таблицы: кишка, pos и cfg

gut и pos разделяют значение, и соединение может быть сделано с gut.gut_val= pos.pos_val.

Аналогично таблицы cfg и pos имеют общее значение, и соединение может быть выполнено с помощью следующего: cfg.cfg_dev_cot = pos.pos_dev_val.

Однако cfg и gut не имеют общего значения. Что я хочу сделать, это отобразить значения для gut_cou, pos_mon_runch и cfg_cfg_cou, когда gut_val = pos_val и cfg_dev_cot = pos_dev_val. Есть ли способ сделать это с объединениями или лучше сделать вложенный оператор SQL?

я попробовал следующее, но выдает ошибку оракула. ​​

select gut.gut_cou, pos.pos_mon_runch, cfg.cfg_cou
from gut,pos,cfg
where gut.gut_val = pos.pos_val
and cfg.cfg_dev_cot = pos.pos_dev_val
and pos.POS_CIT='12345654'
and gut.gut_DAT_DEB <= '08-AUG-11'
and gut.gut_DAT_FIN >= '08-AUG-11'
and gut.gut_TCV ='BOU' 

Ответы [ 3 ]

5 голосов
/ 09 августа 2011

Для начала, избавьтесь от того, кто вас научил использовать нотацию , для соединений. Вместо этого используйте что-то вроде следующего.

Это может не избавить вас от сообщения об ошибке, но вы не сказали нам, в чем ошибка;)

SELECT
  gut.gut_cou,
  pos.pos_mon_ruch,
  cfg.cfg_cou
FROM
  gut
INNER JOIN
  pos
    ON pos.pos_val = gut.gut_val
INNER JOIN
  cfg
    ON cfg.cfg_dev_cot = pos.pos_dev_val
WHERE
    pos.POS_CIT='12345654'
AND gut.gut_DAT_DEB <= '08-AUG-11'
AND gut.gut_DAT_FIN >= '08-AUG-11'
AND gut.gut_TCV ='BOU'
3 голосов
/ 09 августа 2011

Я бы не стал использовать

and gut.gut_DAT_DEB <= '08-AUG-11'
and gut.gut_DAT_FIN >= '08-AUG-11'

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

and gut.gut_DAT_DEB <= TO_DATE('08-AUG-2011','DD-MON-YYYY')
and gut.gut_DAT_FIN >= TO_DATE('08-AUG-2011','DD-MON-YYYY')

Также имейте в виду, что МОЖЕТ быть компонент временина даты, чтобы вы могли хотеть

and gut.gut_DAT_DEB <= TO_DATE('08-AUG-2011 23:59:59','DD-MON-YYYY HH24:MI:SS')
0 голосов
/ 09 августа 2011

Если все три таблицы не разделяют все данные, строки не будут возвращены с вашим выбором.

Попробуйте следующее:

SELECT g.gut_cou, p.pos_mon_runch, c.cfg_cou
  FROM gut g, pos p
  LEFT OUTER JOIN cfg c ON c.cfg_dev_cot = p.pos_dev_val
 WHERE g.gut_val = p.pos_val
   AND p.POS_CIT='12345654'
   AND trunc(g.gut_DAT_DEB, 'DDD') <= TO_DATE('08-AUG-11','DD-MON-YY')
   AND trunc(g.gut_DAT_FIN, 'DDD') >= TO_DATE('08-AUG-11','DD-MON-YY')
   AND g.gut_TCV ='BOU'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...