从键值对表中查询多列的数据库

时间:2011-11-13 16:42:25

标签: c# sql windows-mobile

我正在开发一个sql查询,用于在windows mobile手机上的sql server compact edition 3.5中使用。我需要从三个表中取回一个结果集。

我并不完全记得所有的列名,因为我在家里问这个问题,但这是我正在处理的表的一个很好的例子。

Table 1: Customers
Table 2: PresoldOrders
Table 3: CustomerDetails

*

 ________________________________________
|                                        |
|--------------- Customers --------------|
|________________________________________|
|                                        |
| PK    int            CustomerNumber    |
|       varchar(125)   FirstName         |
|       varchar(125)   LastName          |
|       varchar(125)   Email             |
|       varchar(200)   Address1          |
|       varchar(200)   Address2          |
|       varchar(200)   City              |
|       varchar(2)     State             |
|       varchar(5)     Zip               |
|________________________________________|

*

 ________________________________________
|                                        |
|------------ CustomerDetails -----------|
|________________________________________|
|                                        |
| PK    int            CustomerDetailsId |
| FK    int            CustomerNumber    |
|       varchar(255)   FieldName         |
|       varchar(255)   FieldValue        |
|________________________________________|

*

 ________________________________________
|                                        |
|------------ PresoldOrders -------------|
|________________________________________|
|                                        |
| PK    int            PresoldOrderId    |
| FK    int            CustomerNumber    |
|       int            OrderNumber       |
|       int            RouteStopNumber   |
|       datetime       DeliveryDate      |
|       varchar(100)   Other1            |
|       varchar(100)   Other2            |
|________________________________________| 

现在,查询应该返回客户中存在的所有记录,即使它们在“PresoldOrderHeaders”表中不存在。这部分非常简单,我打算只使用左外连接。查询的第二部分有点复杂。

这是我到目前为止构建的查询。

SELECT c.CustomerNumber
       c.FirstName
       c.LastName
       c.Email
       c.Address1
       c.Address2
       c.City
       c.State
       c.Zip
       po.OrderNumber
       po.DeliveryDate
       po.Other1
       po.Other2
FROM Customer c
LEFT OUTER JOIN PresoldOrders po on c.CustomerNumber = po.CustomerNumber
ORDER BY po.RouteStopNumber; 

Tricky part是CustomerDetails表。以下是一些数据的示例

 _________________________________________________________
|       |                 |              |                |
| PK    | CustomerNumber  | FieldName    | FieldValue     |
|-------|-----------------|--------------|----------------|
| 1     | 1               | A            | 125            |
|-------|-----------------|--------------|----------------|
| 2     | 1               | B            | 126            |
|-------|-----------------|--------------|----------------|
| 3     | 1               | C            | 127            |
|-------|-----------------|--------------|----------------|
| 4     | 2               | A            | 138            |
|-------|-----------------|--------------|----------------|
| 5     | 2               | B            | 140            |
|-------|-----------------|--------------|----------------|
| 6     | 2               | C            | 143            |
|-------|-----------------|--------------|----------------|
|_________________________________________________________|

对于我将在Component One Flex Grid中显示的信息,CustomerDetails表中列出的FieldName将被修复。

我希望存档:

 _____________________________________________________________________________________________________________________
|                 |           |          |     |                     |                     |                          |
| CustomerNumber  | FirstName | LastName | ... | FieldName A's value | FieldName B's Value | FieldName C's Value      |
|-----------------|-----------|----------|-----|---------------------|---------------------|--------------------------|
| 1               | John      | Someone  | ... | 125                 | 126                 | 127                      |
|-----------------|-----------|----------|-----|---------------------|---------------------|--------------------------|
| 2               | Dan       | Other    | ... | 138                 | 140                 | 143                      |
|-----------------|-----------|----------|-----|---------------------|---------------------|--------------------------|
|_____________________________________________________________________________________________________________________|

通常,我会在'CustomerDetails'表中定义A,B和C的列名;但是,这张表不能改变,所以我必须使用我所得到的。我的任务规范中的要求是在移动设备的网格中显示15个以上的列;不是我想要的东西,但这些是要求。

好吧,最后,问题是:

可以使用sql查询键值配对表,并将这些键的值显示在上面的列中吗?这是我的要求,我想我需要在presoldorders表上使用我的连接创建一个查询,然后获取列表中每个客户的所有详细信息列表,并在代码中迭代并合并到数据表中手持式的。

1 个答案:

答案 0 :(得分:0)

如果您事先知道所有键值,则可以转动结果集。我不确定sql server compact是否支持PIVOT,但你可以这样做: select CustomerNumber,
Max(Case when FieldName='A' then FieldValue end) as a_value,
// the same for B, C, all keys.
From CustomerDetails
Group by CustomerNumber

为简单起见,我不加入其他表,但我希望它能让您了解如何将行转换为列。