我需要你的SQL查询帮助,我试图在C#Dataset Query Builder中构建...
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
我发现了大量非常相似的问题,但很少有人有同样的问题需要解决。那些(一个或两个)真的有同样的问题,它有一个解决方案,我只是无法扭曲我的问题。
非常感谢任何帮助......非常感谢,AD
由于每个家庭只有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;
IIf()
表达式的目的是仅在最大客户端Id与最小客户端ID不同时输出最大客户端ID。要在MaxCId
是Null
时返回记录,LEFT JOIN
需要C2
。
我没有在这里加入HouseHold
表,因为我们只需要它的HHID
,也可以在HouseHold_Client
中找到。如果您需要其他列,您当然可以加入它。
子查询:
( SELECT
HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID)) AS MaxCId
FROM HouseHold_Client
GROUP BY HHID
) X
子查询必须括在括号中并给出一个名称(此处为X
)。 X
充当普通表,在主查询中具有列HHID
,MinCId
和MaxCId
。它由HHID
分组。即,它每HHID
返回一行。 Min(CID)
每CID
返回最小的Max(CID)
和CID
最大的HHID
。
在每个HHID
有2个客户的情况下,这意味着Min
和Max
将产生这两个客户。如果您只有一个客户端,那么Min
和Max
都将返回相同的客户端。如果是这种情况,那么IIf
将返回Null
而不是Max(CID)
,以避免返回两次相同的客户端。