1

我将 MS-Access 2003 与查询创建器一起使用。我从一个表 ( ) 中选择所有内容,然后从另一个表 ( ) 中选择FaitsSaillants一个特定行 ( )。我想从第二个表中选择另一行并将其连接起来。WHERE VARIABLE='TitreMandat'tb_SOMMAIRE

查询

PARAMETERS
    [CurrAxe] Text ( 255 ), [CurrOTP] Text ( 255 ),
    [CurrClient] Text ( 255 ), [StartDate] DateTime, [EndDate] DateTime;
SELECT 
    tb_SOMMAIRE.Valeur AS Projet, tb_SOMMAIRE.VARIABLE, *
FROM
    (FaitsSaillants
     LEFT JOIN Employes
         ON FaitsSaillants.Utilisateur = Employes.CIP)
    INNER JOIN tb_SOMMAIRE
        ON FaitsSaillants.OTP = tb_SOMMAIRE.OTP
WHERE
    (((FaitsSaillants.OTP)=[CurrOTP]) AND 
     ((FaitsSaillants.Client) Like [CurrClient]) AND
     ((FaitsSaillants.Axe) Like [CurrAxe]) AND
     ((DateValue([DateInsertion]))>=[StartDate] AND
      (DateValue([DateInsertion]))<=[EndDate]) AND
     ((tb_SOMMAIRE.VARIABLE)='TitreMandat'))
ORDER BY
    FaitsSaillants.DateInsertion DESC;

此查询确实添加了tb_SOMMAIRE.ValeurID(OTP字段)匹配的字段和 where tb_SOMMAIRE.VARIABLE='TitreMandat'。它就像一个魅力。但是,我想在tb_SOMMAIRE结果中添加另一行。我想获得 where VARIABLE='TitreMandat'(该部分实际上正在工作)的行和 where 的行VARIABLE='NomInstallation'。我将得到 2 行,并且我希望在我要求Projet( tb_SOMMAIRE.Value as Projet) 时将这 2 行连接起来并显示出来。两行的OTP(ID) 与在 中选择的行相同FaitsSaillants

对不起,如果是法语。

表的结构

FaitsSaillants

Index AutoNumber
Projet Text
Axe Text
Client Text
OTP Text
FaitSaillant Memo
DateInsertion Date
Utilisateur Text

tb_SOMMAIRE

OTP Text
VARIABLE Text
Valeur Text

数据示例

tb_SOMMAIRE

OTP   VARIABLE        Valeur
UGPSW NomInstallation PosteNemiscau
UGPSW TitreMandat     oscilloperturbographe
UGPSW RespIng         CU9656
GWIHK NomInstallation AnotherInstallation
GWIHK TitreMandat     Anytitle
GWIHK Responsable     ImportantPerson
4

1 回答 1

1

怎么样:

PARAMETERS [CurrAxe] TEXT ( 255 ), [CurrOTP] TEXT ( 255 ), [CurrClient] TEXT (
255 ), [StartDate] DATETIME, [EndDate] DATETIME;

SELECT q.Projet, *
FROM   (faitssaillants f
LEFT JOIN employes e
ON f.utilisateur = e.cip)
INNER JOIN (
SELECT s1.otp,
     [s1].[valeur] & "," & [s2].[valeur] AS Projet
FROM   (
  SELECT otp, valeur
  FROM   tb_sommaire
  WHERE  [variable] = 'TitreMandat') AS s1
INNER JOIN (
   SELECT otp, valeur
   FROM   tb_sommaire 
   WHERE  [variable] = 'NomInstallation') AS s2
ON s1.otp = s2.otp) q
ON f.otp = q.otp
WHERE f.otp  = [currotp] 
AND f.client LIKE [currclient] 
AND f.axe LIKE [curraxe] 
AND Datevalue([dateinsertion]) 
    Between [startdate] And [enddate] 
ORDER  BY f.dateinsertion DESC; 

始终最好避免将所有字段都引用为 *。字段(列)应按名称列出。

以上依赖于创建一个派生表,该表通过 Otp 对来自 tb_sommaire 的行进行分组。您可以将派生表剪切并粘贴到查询设计屏幕(sql 视图)中,以检查返回的行是否符合预期。

于 2012-10-31T13:29:21.107 回答