2013-08-05 40 views
0

我已经得到了这个查询,我试图使用列标识符(我不知道它是如何调用的),但有些似乎工作,其他不是。SQL查询中的表别名

SELECT R1.EC_Date, R1.JO_Num, R1.EC_Intitule, R1.EC_Sens, R1.EC_RefPiece, R1.EC_Piece, R1.CG_Num, R1.EC_Reference, R1.JM_Date, R1.EC_Jour, R2.EC_Lettrage, R2.EC_Pointage 
FROM ((F_COMPTEA CA INNER JOIN F_ECRITUREA EA ON CA.CA_Num = EA.CA_Num) 
       INNER JOIN F_ECRITUREC EC ON EA.EC_No = EC.EC_No) R1 
     INNER JOIN (
      SELECT * 
      FROM F_ECRITUREC 
      WHERE (CG_Num LIKE '401%' OR CG_Num LIKE '411%') 
      AND (JO_Num = 'RAN' OR JO_Num = 'ACH' OR JO_Num = 'VTE') 
      AND EC_RefPiece IN (
       SELECT EC_RefPiece 
       FROM F_ECRITUREA EA INNER JOIN F_ECRITUREC EC ON EA.EC_No = EC.EC_No 
       WHERE EC_Jour BETWEEN '1' AND '31' 
       AND JM_Date = '2013-01-07' 
       AND JO_Num = 'ACH' 
       AND EA.CA_Num LIKE '%')) R2 
     ON R1.EC_RefPiece = R2.EC_RefPiece 
WHERE EC_Jour BETWEEN '1' AND '31' 
AND JM_Date = '2013-01-07' 
AND JO_Num = 'ACH' 
AND EA.CA_Num LIKE '%'; 

在这种情况下,CA,EA和EC标识工作正常,和连接工作正常,但是当我尝试添加的最后一个与R1和R2标识符JOIN,它不会出现正在工作,我找不到差异。 我有的错误是:R1/R2附近的语法不正确。 我试过使用AS,但它也无法正常工作,所以我确定它是一个语法问题还是其他地方的问题的结果。 顺便说一句,这是MS SQL。

任何帮助将不胜感激,谢谢。

+0

他们被称为*表别名*。请明确提及您得到的错误。 – GolezTrol

+0

R1附近的语法不正确 R2附近的语法不正确 – user2618988

回答

1

SELECT子查询R1缺少子句。 而且您可能不再需要在外部选择中的WHERE条件。你在R2中应用它们。但可以肯定的是,您不再可以在外部选择中参考EA列。外部查询中只有R1和R2别名可用。

话虽这么说,我相信你的查询应该是这个样子

SELECT R1.EC_Date, 
     R1.JO_Num, 
     R1.EC_Intitule, 
     R1.EC_Sens, 
     R1.EC_RefPiece, 
     R1.EC_Piece, 
     R1.CG_Num, 
     R1.EC_Reference, 
     R1.JM_Date, 
     R1.EC_Jour, 
     R2.EC_Lettrage, 
     R2.EC_Pointage 
    FROM 
(
    SELECT * -- you has been missing SELECT here 
     FROM F_COMPTEA CA JOIN F_ECRITUREA EA 
     ON CA.CA_Num = EA.CA_Num JOIN F_ECRITUREC EC 
     ON EA.EC_No = EC.EC_No 
) R1 JOIN 
(
    SELECT * 
     FROM F_ECRITUREC 
    WHERE (CG_Num LIKE '401%' OR CG_Num LIKE '411%') 
     AND (JO_Num = 'RAN' OR JO_Num = 'ACH' OR JO_Num = 'VTE') 
     AND EC_RefPiece IN 
     (
      SELECT EC_RefPiece 
       FROM F_ECRITUREA EA INNER JOIN F_ECRITUREC EC ON EA.EC_No = EC.EC_No 
      WHERE EC_Jour BETWEEN '1' AND '31' 
       AND JM_Date = '2013-01-07' 
       AND JO_Num = 'ACH' 
       AND EA.CA_Num LIKE '%' 
     ) 
) R2 ON R1.EC_RefPiece = R2.EC_RefPiece 
-- WHERE EC_Jour BETWEEN '1' AND '31' 
-- AND JM_Date = '2013-01-07' 
-- AND JO_Num = 'ACH' 
-- AND EA.CA_Num LIKE '%' you're no longer can reference `EA` columns in outer select. Only R1 and R2 aliases available in your outer query 
+0

我只需要将SELECT *替换为我需要的列名,否则会出现两次出现列的错误。虽然像魅力一样工作,非常感谢! – user2618988

+0

你更受欢迎。我很高兴我可以帮助:) – peterm

0
SELECT 
R1.EC_Date, 
R1.JO_Num, 
R1.EC_Intitule, 
R1.EC_Sens, 
R1.EC_RefPiece, 
R1.EC_Piece, 
R1.CG_Num, 
R1.EC_Reference, 
R1.JM_Date, 
R1.EC_Jour, 

R2.EC_Lettrage, 
R2.EC_Pointage 

FROM 

(SELECT * 
FROM 
F_COMPTEA 
INNER JOIN F_ECRITUREA EA 
ON CA.CA_Num = EA.CA_Num 
INNER JOIN F_ECRITUREC EC 
ON EA.EC_No = EC.EC_No 
) AS R1 


INNER JOIN 
(
SELECT * 
FROM 
F_ECRITUREC 
WHERE 
(CG_Num LIKE '401%' OR CG_Num LIKE '411%') 
AND (JO_Num = 'RAN' OR JO_Num = 'ACH' OR JO_Num = 'VTE') 
AND EC_RefPiece IN (SELECT EC_RefPiece FROM F_ECRITUREA EA INNER JOIN F_ECRITUREC EC ON EA.EC_No = EC.EC_No 
WHERE EC_Jour BETWEEN '1' AND '31' 
AND JM_Date = '2013-01-07' 
AND JO_Num = 'ACH' 
AND EA.CA_Num LIKE '%') 

) AS R2 

ON R1.EC_RefPiece = R2.EC_RefPiece 

WHERE 
R2.EC_Jour BETWEEN '1' AND '31' 
AND R2.JM_Date = '2013-01-07' 
AND R2.JO_Num = 'ACH' 
--THERE IS NO CONDITION WITHIN THIS LIKE? 
AND R2.CA_Num LIKE '%'