Oracle SQL内部选择不起作用

时间:2014-07-19 00:26:55

标签: sql oracle

我的pl / sql语句有问题。

这是一个很好的工作选择声明:

SELECT P.DAYS FROM PLPLANPEAKPROGRAM P WHERE P.ID = 1060;

返回; 1,2,3(varchar2)

主sql在这里:

SELECT * 
from FIFLIGHTS   
LEFT JOIN PLPLANPEAKPROGRAMCOPY ON FIFLIGHTS.IATACODE = PLPLANPEAKPROGRAMCOPY.STATIONCODE   
WHERE  TO_CHAR(FIFLIGHTS.SCHEDULEDTIME, 'D') IN (SELECT  P.DAYS 
                                                 FROM PLPLANPEAKPROGRAM P 
                                                 WHERE P.ID = 1060) ;

但这不会返回任何结果。

此上面的内容也很好;

SELECT * 
from FIFLIGHTS   
LEFT JOIN PLPLANPEAKPROGRAMCOPY ON FIFLIGHTS.IATACODE = LPLANPEAKPROGRAMCOPY.STATIONCODE   
WHERE TO_CHAR(FIFLIGHTS.SCHEDULEDTIME, 'D') IN (1,2,3);

有什么问题和解决方案,请帮帮忙?

2 个答案:

答案 0 :(得分:2)

你这么说:

SELECT P.DAYS
FROM PLPLANPEAKPROGRAM P
WHERE P.ID = 1060;

返回1,2,3。这意味着它返回一个字符串值。不是包含三个元素的列表。 to_char()函数调用返回单个值,例如12。没有逗号,所以这些都不匹配。

这是一种糟糕的数据格式。您应该存储每行一个元素的列表。 SQL提供了一种非常强大的存储列表的方法,称为表。也就是说,您可以使用exists

解决此问题
SELECT *
from FIFLIGHTS LEFT JOIN
     PLPLANPEAKPROGRAMCOPY
     ON FIFLIGHTS.IATACODE = PLPLANPEAKPROGRAMCOPY.STATIONCODE
WHERE EXISTS (SELECT 1
              FROM PLPLANPEAKPROGRAM P
              WHERE P.ID = 1060 and
                    P.DAYS LIKE '%' || TO_CHAR(FIFLIGHTS.SCHEDULEDTIME, 'D') || '%'
             );

答案 1 :(得分:0)

SELECT * from FIFLIGHTS LEFT JOIN 
PLPLANPEAKPROGRAMCOPY ON FIFLIGHTS.IATACODE = PLPLANPEAKPROGRAMCOPY.STATIONCODE
WHERE TO_CHAR(FIFLIGHTS.SCHEDULEDTIME, 'D') 
IN (SELECT P.DAYS FROM PLPLANPEAKPROGRAM P WHERE P.ID = '1060') ;

为您的参数'1060'

添加单引号