2011-11-15 67 views
1

我有一个复杂的select语句,当它被执行时,我给它一个我想要的日期或日期范围,并输出。问题是我不知道如何加入同一个SQL语句,第一个语句有一个日期范围,第二个语句有另一个数据范围。下面的例子:使用Outer Join和多个别名连接两个SELECT语句

当我执行SELECT语句,我选择了十一月份:
EMPLID NAME Current_Gross_Hours(十一月)

当我再次执行SELECT语句,我从一月选择十一月:
EMPLID NAME Year_To_Date_Hours(1至11月)

我想要什么:
EMPLID NAME Current_Gross_Hours(十一月)Year_To_Date_Hours(1至11月)

如果自行执行,SQL Select语句将正确运行。但我不知道如何加入他们。 这是我想写的SQL代码,但我不知道如何正确编写SQL语句。任何帮助或方向,不胜感激。

(SELECT DISTINCT 
SUM("PSA"."AL_HOURS") AS "Current Gross Hours", "PSJ"."EMPLID","PSP"."NAME" 
FROM 
"PS_JOB" "PSJ", "PS_EMPLOYMENT" "PSE", "PS_PERSONAL_DATA" "PSP", "PS_AL_CHK_HRS_ERN" "PSA" 
WHERE 
((("PSA"."CHECK_DT" = TO_DATE('2011-11-01', 'YYYY-MM-DD')) AND 
("PSJ"."PAYGROUP" = 'SK2') AND 
(("PSJ"."EFFSEQ"= ( 
    SELECT MAX("INNERALIAS"."EFFSEQ") 
    FROM "PS_JOB" INNERALIAS 
    WHERE "INNERALIAS"."EMPL_RCD_NBR" = "PSJ"."EMPL_RCD_NBR" 
    AND "INNERALIAS"."EMPLID" = "PSJ"."EMPLID" 
    AND "INNERALIAS"."EFFDT" = "PSJ"."EFFDT") 
AND 
"PSJ"."EFFDT" = ( 
    SELECT MAX("INNERALIAS"."EFFDT") 
    FROM "PS_JOB" INNERALIAS 
    WHERE "INNERALIAS"."EMPL_RCD_NBR" = "PSJ"."EMPL_RCD_NBR" 
    AND "INNERALIAS"."EMPLID" = "PSJ"."EMPLID" 
    AND "INNERALIAS"."EFFDT" <= SYSDATE))))) 
AND 
("PSJ"."EMPLID" = "PSE"."EMPLID") AND ("PSJ"."EMPLID" = "PSP"."EMPLID") AND ("PSJ"."FILE_NBR" = "PSA"."FILE_NBR") AND ("PSJ"."PAYGROUP" = "PSA"."PAYGROUP") AND ("PSE"."EMPLID" = "PSP"."EMPLID") 
GROUP BY 
"PSJ"."EMPLID", "PSP"."NAME" 
) AS "Q1" 

LEFT JOIN 


(SELECT DISTINCT 
SUM("PSA"."AL_HOURS") AS "YEAR_TO_DATE Gross Hours", "PSJ"."EMPLID" 
FROM 
"PS_JOB" "PSJ", "PS_EMPLOYMENT" "PSE", "PS_PERSONAL_DATA" "PSP", "PS_AL_CHK_HRS_ERN" "PSA" 
WHERE 
((("PSA"."CHECK_DT" BETWEEN TO_DATE('2011-01-01', 'YYYY-MM-DD') AND TO_DATE('2011-11-01', 'YYYY-MM-DD')) AND 
("PSJ"."PAYGROUP" = 'SK2') AND 
(("PSJ"."EFFSEQ"= ( 
    SELECT MAX("INNERALIAS"."EFFSEQ") 
    FROM "PS_JOB" INNERALIAS 
    WHERE "INNERALIAS"."EMPL_RCD_NBR" = "PSJ"."EMPL_RCD_NBR" 
    AND "INNERALIAS"."EMPLID" = "PSJ"."EMPLID" 
    AND "INNERALIAS"."EFFDT" = "PSJ"."EFFDT") 
AND 
"PSJ"."EFFDT" = ( 
    SELECT MAX("INNERALIAS"."EFFDT") 
    FROM "PS_JOB" INNERALIAS 
    WHERE "INNERALIAS"."EMPL_RCD_NBR" = "PSJ"."EMPL_RCD_NBR" 
    AND "INNERALIAS"."EMPLID" = "PSJ"."EMPLID" 
    AND "INNERALIAS"."EFFDT" <= SYSDATE))))) 
AND 
("PSJ"."EMPLID" = "PSE"."EMPLID") AND ("PSJ"."EMPLID" = "PSP"."EMPLID") AND ("PSJ"."FILE_NBR" = "PSA"."FILE_NBR") AND ("PSJ"."PAYGROUP" = "PSA"."PAYGROUP") AND ("PSE"."EMPLID" = "PSP"."EMPLID") 
GROUP BY 
"PSJ"."EMPLID" 
) AS "Q2" 
ON "Q1"."EMPLID"="Q2"."EMPLID" 
ORDER BY 
"Q1"."NAME" 
+0

从来没有听说过VIEW? –

+0

你正在使用哪个SQL ... MySQL,SQL Server,Oracle? – DRapp

+0

我不确定我可以做VIEW。我想我只是给了查询访问权限。我会试着看看会发生什么。 SQL是ORACLE – user1048616

回答

4

您在开始时缺少SELECT ... FROMAS关键字仅适用于创建列别名时,而不是查询块别名。引号仅对区分大小写的列名是必需的 - 在您的示例中它们看起来不正确,但它们经常会导致错误。

SELECT Q1.NAME, ... 
FROM 
(
    SELECT ... 
) Q1 
JOIN 
(
    SELECT ... 
) Q2 
ON Q1.EMPLID=Q2.EMPLID 
ORDER BY Q1.NAME 
+0

因此,我不应该使用“PSP”字段“NAME”(“PSP”,“NAME”)的我的表别名,而应该使用“Q1”的select语句别名,而保持原样?谢谢。 – user1048616