【问题标题】:SQL query from multiple tables with complicated condition条件复杂的多表SQL查询
【发布时间】:2017-04-12 10:31:26
【问题描述】:

我有以下表格:

1- EMP_INFO_STATUS (main table)
2- NEW_EMP_PERSONAL
3- NEW_EMP_NOTE
4- NEW_EMP_CRS
5- NEW_EMP_CER
6- EMPLOYEES

我想要那个 sql 语句

如果满足以下条件,则返回表 EMP_INFO_STATUS 中的所有记录:

  • EMP_INFO_STATUS 表中的状态值 = 2 ==AND==
  • 员工在表 NEW_EMP_CRS 中有记录 或
  • 员工在表 NEW_EMP_CER 中有记录 或
  • 员工在表 NEW_EMP_NOTE 中有记录 或
  • 员工在表 NEW_EMP_PERSONAL 中有记录 (AND) 名为 SECONDMENT_IMAGE 的 clomn 不是 Null

这个sql不起作用

SELECT A.EMP_NO,A.STATUS, 
        B.EMPLOYEE_NO,B.EMP_1ST_NAME,B.EMP_2ND_NAME,
        B.EMP_3RD_NAME,B.EMP_4TH_NAME
FROM p9.EMP_INFO_STATUS A, 
     p9.EMPLOYEES B, 
     p9.NEW_EMP_PERSONAL C, 
     p9.NEW_EMP_NOTE D, 
     p9.NEW_EMP_CRS E, 
     p9.NEW_EMP_CER F
WHERE
        A.EMP_NO = B.EMPLOYEE_NO
    AND A.EMP_NO = C.EMP_NO(+)
    AND A.EMP_NO = C.EMP_NO(+)
    AND A.EMP_NO = E.EMP_NO(+)
    AND A.EMP_NO = F.EMP_NO(+)
    AND A.STATUS = 2 
    AND (
                C.SECONDMENT_IMAGE is not NULL 
            OR  C.NOTES is not NULL 
            OR  D.NOTE is not NULL 
            OR  E.EMP_NO IS NOT NULL 
            OR  F.EMP_NO IS NOT NULL
        )
    GROUP BY A.EMP_NO, A.STATUS, B.EMPLOYEE_NO, 
             B.EMP_1ST_NAME,B.EMP_2ND_NAME,
             B.EMP_3RD_NAME,B.EMP_4TH_NAME

【问题讨论】:

  • 不用喊了
  • 不起作用?? 不是很有帮助的描述。它在什么方面不起作用。
  • 它返回一个员工,该员工在表 C 中有数据,但 secondment_image 列和 notes 列为空
  • 你可能想看看使用 JOIN 语法

标签: php sql oracle


【解决方案1】:

试试这个未经测试的选择语句:

SELECT InnerQuery.EMP_NO
     , InnerQuery.STATUS
     , Employees.EMPLOYEE_NO
     , Employees.EMP_1ST_NAME
     , Employees.EMP_2ND_NAME
     , Employees.EMP_3RD_NAME
     , Employees.EMP_4TH_NAME
FROM 
(
    SELECT A.EMP_NO
         , A.STATUS
         , B.EMPLOYEE_NO
         , COUNT(B.EMPLOYEE_NO) +
           COUNT(C.EMPLOYEE_NO) +
           COUNT(D.EMPLOYEE_NO) +
           COUNT(E.EMPLOYEE_NO) +
           COUNT(F.EMPLOYEE_NO) as subrecords
    FROM p9.EMP_INFO_STATUS A
    LEFT JOIN p9.EMPLOYEES B
        ON B.EMPLOYEE_NO = A.EMP_NO 
        AND B.SECONDMENT_IMAGE IS NOT NULL
    LEFT JOIN p9.NEW_EMP_PERSONAL C
        ON C.EMP_NO = A.EMP_NO
    LEFT JOIN p9.NEW_EMP_NOTE D
        ON D.EMP_NO = A.EMP_NO
    LEFT JOIN p9.NEW_EMP_CRS E
        ON E.EMP_NO = A.EMP_NO
    LEFT JOIN p9.NEW_EMP_CER F
        ON F.EMP_NO = A.EMP_NO
    WHERE A.STATUS = 2
    GROUP BY A.EMP_NO
    HAVING subrecords > 0
    -- this may need to be: HAVING COUNT(B.EMPLOYEE_NO) + COUNT(C.EMPLOYEE_NO) + COUNT(D.EMPLOYEE_NO) + COUNT(E.EMPLOYEE_NO) + COUNT(F.EMPLOYEE_NO) > 0
)
LEFT JOIN p9.EMPLOYEES Employees
    ON Employees.EMPLOYEE_NO = InnerQuery.EMP_NO;

【讨论】:

  • 我删除了表别名并添加了一个having子句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多