在复杂SQL查询中连接两行

在复杂SQL查询中连接两行,sql,ms-access,concatenation,Sql,Ms Access,Concatenation,我正在使用MS Access 2003和查询创建者。我从一个表(faissalants)中选择所有内容,然后从另一个表(tb_SOMMAIRE)中选择一个特定行(WHERE VARIABLE='titremadat')。我想从第二个表中选择另一行并连接它 询问 参数 [CurroX]文本(255),[CurrOTP]文本(255), [CurrClient]文本(255),[StartDate]日期时间,[EndDate]日期时间; 挑选 tb_SOMMAIRE.Valeur作为项目,tb_SO

我正在使用MS Access 2003和查询创建者。我从一个表(
faissalants
)中选择所有内容,然后从另一个表(
tb_SOMMAIRE
)中选择一个特定行(
WHERE VARIABLE='titremadat'
)。我想从第二个表中选择另一行并连接它

询问
参数
[CurroX]文本(255),[CurrOTP]文本(255),
[CurrClient]文本(255),[StartDate]日期时间,[EndDate]日期时间;
挑选
tb_SOMMAIRE.Valeur作为项目,tb_SOMMAIRE.VARIABLE*
从…起
(信仰者)
左联雇员
关于信条。利用率=雇员。CIP)
内连接tb_SOMMAIRE
关于faissuillants.OTP=tb_SOMMAIRE.OTP
哪里
(((faissalillants.OTP)=[CurrOTP])和
((faissuillants.Client)如[CurrClient])和
((faithsullants.Axe)类似于[CurrAxe]),以及
((DateValue([DateInsertion])>=[StartDate]和
(DateValue([DateInsertion])怎么样:

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; 
最好避免引用所有字段,因为*.fields(columns)应按名称列出

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

如何:

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; 
最好避免引用所有字段,因为*.fields(columns)应按名称列出


上述操作取决于创建一个派生表,该表通过Otp对tb_sommaire中的行进行分组。您可以将派生表剪切并粘贴到查询设计屏幕(sql视图)中检查返回的行是否如预期的那样。

显示一些示例数据和示例结果显示一些示例数据和示例结果即使只有5个参数,我也收到一个错误,说我需要输入6。第6个参数是q.value???另一个错误消息。它是法语的,但基本上说,它说语法不正确或太复杂,无法使用被评估。建议将部分分配给变量。但是,查询似乎在设计窗口中正确呈现,直到执行时我才收到错误消息。顺便说一句,感谢您的帮助,非常感谢。这是另一个问题。Faissualants是表还是查询?如果是查询,则可能是问题所在em和您将需要发布sql。如果没有,您将需要在问题中包含有关表结构和数据的更多信息。让我们说不。在某个阶段,您必须继续,但是,您可以在查询设计窗口中引用查询,因此您可以使用在查询设计窗口中创建的三个查询来构建它。这不是最糟糕的问题可以了解所涉及的SQL。一旦yu有了这三个查询,您就可以开始用SQL替换查询的名称来创建派生表。即使只有5个参数,我也会收到一个错误,说我需要输入6。第6个参数是q.value???另一个错误消息。它是法语的,但基本上是语法不正确或太复杂,无法计算。建议将部分分配给变量。但是,查询在设计窗口中似乎呈现正确,只有在执行时我才会收到错误消息。顺便说一句,非常感谢您的帮助。这是另一个问题。Faissualants是表还是查询?如果是查询这可能就是问题所在,您需要发布sql。否则,您需要在问题中包含有关表结构和数据的更多信息。不可以。在某个阶段,您必须继续,但是,您可以在“查询设计”窗口中引用一个查询,以便使用在查询设计中创建的三个查询来构建它这并不是理解所涉及的SQL的最糟糕的方法。一旦你有了这三个查询,你就可以开始用SQL替换查询的名称来创建一个派生表。
OTP   VARIABLE        Valeur
UGPSW NomInstallation PosteNemiscau
UGPSW TitreMandat     oscilloperturbographe
UGPSW RespIng         CU9656
GWIHK NomInstallation AnotherInstallation
GWIHK TitreMandat     Anytitle
GWIHK Responsable     ImportantPerson
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;