C# 数据集设计器 - AccesDB - 将两行合并为一行

C# DataSet Designer - AccesDB - Combine two rows into one

提问人:Andras 提问时间:3/31/2019 最后编辑:ParfaitAndras 更新时间:4/1/2019 访问量:109

问:

我需要您的帮助来处理 SQL 查询,我正在尝试在 C# 数据集查询生成器中构建该查询...

SELECT HouseHold.HHID, Client.FIRST_NAME, Client.LAST_NAME 
FROM ((Client 
INNER JOIN HouseHold_Client ON Client.CID = HouseHold_Client.CID) 
INNER JOIN HouseHold ON HouseHold_Client.HHID = HouseHold.HHID)

上面的代码给了我所有 HouseHolds(他们的 ID)列表,其中包含属于他们的客户:

HHID  |  FIRST_NAME |  LAST_NAME
------------------------------
1     |  Penelope   |  Grant
1     |  Brian      |  Dyer
2     |  James      |  Newman
2     |  Richard    |  Parsons

..但我无法弄清楚如何让属于同一个 HouseHold 的人出现在同一行上,就像稍后的数据网格视图一样:

HHID | I_FIRST_NAME | I_LAST_NAME | II_FIRST_NAME | II_LAST_NAME
-----------------------------------------------------------------
1    | Penelope     | Grant       | Brian         | Dyer
2    | James        | Newman      | Richard       | Parsons

我发现了很多非常相似的问题,但很少有人有相同的问题需要解决。那些(一两个)确实有同样的问题并且它有一个解决方案,我只是无法绕过我的问题。

非常感谢任何帮助... 谢谢 广告

C# SQL MS-访问-2016

评论

0赞 Olivier Jacot-Descombes 3/31/2019
每个家庭总是最多2人吗?
0赞 Andras 3/31/2019
是的。。。最小值 1,最大值 2。谢谢。。。

答:

0赞 Olivier Jacot-Descombes 3/31/2019 #1

由于每个家庭只有 2 个人,因此您可以使用该技巧来获取每个家庭的最小和最大客户 ID。这是在子查询中完成的。

SELECT
    X.HHID,
    C1.FIRST_NAME AS I_FIRST_NAME, C1.LAST_NAME AS I_LAST_NAME,
    C2.FIRST_NAME AS II_FIRST_NAME, C2.LAST_NAME AS II_LAST_NAME
FROM
    ((  SELECT
            HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID))  AS MaxCId
        FROM HouseHold_Client
        GROUP BY HHID
    ) X
    INNER JOIN Client AS C1
        ON X.MinCId = C1.CID)
    LEFT JOIN Client AS C2
        ON X.MaxCId = C2.CID;

表达式的目的是仅当最大客户端 ID 与最小客户端 ID 不同时才输出该 ID。要在 时返回记录,需要 a。IIf()MaxCIdNullLEFT JOINC2

我没有加入这里的表格,因为我们只需要 from it,它也可以在 .当然,如果您需要其他列,也可以加入它。HouseHoldHHIDHouseHold_Client


子查询:

(  SELECT
        HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID))  AS MaxCId
    FROM HouseHold_Client
    GROUP BY HHID
) X

子查询必须括在括号中,并给出一个名称(此处)。 充当具有列的普通表,并在主查询中。它按 分组。即,它每 返回一行。 返回每个 的最小和最大值。XXHHIDMinCIdMaxCIdHHIDHHIDMin(CID)CIDMax(CID)CIDHHID

如果您每个有 2 个客户端,这意味着并将产生这 2 个客户端。如果只有 1 个客户端,则两个客户端都将返回相同的客户端。如果是这种情况,则将返回而不是避免返回两次相同的客户端。HHIDMinMaxMinMaxIIfNullMax(CID)

评论

0赞 Andras 4/1/2019
嗨,奥利维尔...您的解决方案正好满足了我的需求。这对我来说仍然太多了......干得好,谢谢..为什么 Designer 说:“向导在配置 TableAdapter 时检测到以下问题:'Fill'。详:!生成的 SELECT 语句。函数参数列表中的错误 '=' not recognized“.,')' 和 'LEFT' 也相同。“无法解析查询文本。” ?虽然它给了我这一切,但它给了我预期的结果......再次非常感谢...
0赞 Olivier Jacot-Descombes 4/1/2019
有时,手动构造的命令只能在 SQL 视图中查看,而不能在设计器视图中查看。