一起使用OUTER JOIN AND OR运算符

时间:2015-07-29 10:06:36

标签: mysql sql

如何将外连接和/或运算符与下面提到的条件一起使用

表1:PERSON

ID_NO         NAME
512           RAM
513           RAVI
514           RAMU

表2:FORM_DETAILS

APPL_DATE      STATUS  ID NO 
12/09/2009       A       512
12/08/2010       A       513
12/07/2009       C       514
12/06/2006       S       513 

查询

SELECT A.ID_NO,A.NAME B.APPL_DATE FROM PERSON A, FORM_DETAILS B
WHERE A.ID_NO=B.ID_NO(+) AND
B.APPL_DATE>='12/07/2009' AND
B.APPL_DATE<='12/09/2009' AND
B.STATUS='A' OR
B.STATUS='C'
ORDER BY APPL_DATE

可生产

Error: outer join operation(+) is not allowed in operand of or

任何建议都表示赞赏。

4 个答案:

答案 0 :(得分:0)

只需将您的查询更改为(如果您希望坚持使用旧的 #color-1 { height: 33%; background: {{yourName}}; vertical-align: top; background: red; display: flex; justify-content: center; flex-direction: column; } 表示法,不鼓励,因为它是特定于供应商的语法,并且已弃用):

(+)

更好,如果你想编写ANSI兼容的SQL:

SELECT A.ID_NO,
       A.NAME, 
       B.APPL_STATUS
  FROM PERSON A, 
       FORM_DETAILS B
    WHERE A.ID_NO = B.ID_NO(+) 
      AND B.APPL_DATE BETWEEN '12/07/2009' AND '12/09/2009'
      AND B.STATUS IN ('A', 'C')
ORDER BY APPL_DATE

答案 1 :(得分:0)

您应该使用显式联接类型而不是(+)

SELECT A.ID_NO,A.NAME B.APPL_STATUS 
FROM PERSON A LEFT JOIN FORM_DETAILS B ON A.ID_NO=B.ID_NO
WHERE
B.APPL_DATE BETWEEN '12/07/2009' AND '12/09/2009' AND
(B.STATUS = 'A' OR
B.STATUS = 'C')
ORDER BY APPL_DATE

答案 2 :(得分:0)

而不是几十年来弃用的语法更好地使用LEFT JOIN

SELECT A.ID_NO,A.NAME B.APPL_STATUS FROM PERSON A
LEFT JOIN FORM_DETAILS B
ON A.ID_NO=B.ID_NO AND
B.APPL_DATE>='12/07/2009' AND
B.APPL_DATE<='12/09/2009' AND
B.STATUS='A' OR
B.STATUS='C'
ORDER BY APPL_DATE

答案 3 :(得分:0)

忘记联接的+语法。学习使用显式join语法。它在数据库中更容易和兼容。

你需要注意放置条件的位置。我想你想要:

SELECT P.ID_NO, P.NAME, FD.APPL_STATUS
FROM PERSON P LEFT JOIN
     FORM_DETAILS FD
     ON P.ID_NO = FD.ID_NO AND
        FD.APPL_DATE >= DATE '2009-12-07' and DATE '2009-12-09' AND
        FD.STATUS IN ('A', 'C')
ORDER BY FD.APPL_DATE;

请注意使用IN代替OR。我非常确定这对你要做的事情有正确的语义。