小编典典

在复杂的SQL查询中串联2行

sql

我正在将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.Valeur在ID(OTP字段)与where匹配的地方添加了字段tb_SOMMAIRE.VARIABLE='TitreMandat'。它像一种魅力。但是,我想在tb_SOMMAIRE结果中添加另一行。我想获得行所在的位置VARIABLE='TitreMandat'(该部分实际上在工作)和行所在的位置VARIABLE='NomInstallation'。我将得到2行,并且当我要求Projettb_SOMMAIRE.Value as Projet)时,我希望将这两行连接并显示。这两行OTP(ID)与中选择的行相同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

阅读 235

收藏
2021-04-14

共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视图)中,以检查返回的行是否符合预期。

2021-04-14