SQL查询,从一个表中获取列名值,从另一个表中获取记录值?
我需要您的帮助来获取SQL查询 我有一个表“订单”,其中包含订单详细信息。此外,我们还有一个附加表“ExtraFields”。这包含一些客户机希望使用订单填充的额外字段的名称。列名称类似于Id、ClientId、ColumnName 现在我们还有另一个表“ExtraFieldValues”(OrderId、ExtraFieldId、Value…)。这具有任何特定顺序的外部字段的实际值 不同的客户机有不同的外部字段,如:备注、'Reason'、'Additional Req'等 现在,我需要得到一个查询,以返回订单详细信息的记录,包括这些作为列名的外部字段和作为单行记录的值 这些表看起来像(为了保持简单,我删除了一些列) 订单表: 外场表: ExtraFieldValue表: 查询将针对每个客户机运行,因此如果运行查询以获取客户机98963的订单,它应该如下所示 我对这个sql非常陌生,任何指针都会很有帮助SQL查询,从一个表中获取列名值,从另一个表中获取记录值?,sql,sql-server,Sql,Sql Server,我需要您的帮助来获取SQL查询 我有一个表“订单”,其中包含订单详细信息。此外,我们还有一个附加表“ExtraFields”。这包含一些客户机希望使用订单填充的额外字段的名称。列名称类似于Id、ClientId、ColumnName 现在我们还有另一个表“ExtraFieldValues”(OrderId、ExtraFieldId、Value…)。这具有任何特定顺序的外部字段的实际值 不同的客户机有不同的外部字段,如:备注、'Reason'、'Additional Req'等 现在,我需要得到一
谢谢键/值表很麻烦。如果知道要选择哪些额外列,请使用相关子查询:
select
o.description,
o.createdate,
(
select efv.value
from extrafieldvalue efv
where efv.orderid = o.id
and efv.extrafieldid = (select id from extrafield where columnname = 'AdditionalInfo')
) as additionalinfo,
(
select efv.value
from extrafieldvalue efv
where efv.orderid = o.id
and efv.extrafieldid = (select id from extrafield where columnname = 'Notes')
) as notes
from orders o;
如果您不知道要选择哪些额外的列,请选择所有内容,然后使用应用程序或网页的编程语言来确定要显示哪些列。键/值表很麻烦。如果知道要选择哪些额外列,请使用相关子查询:
select
o.description,
o.createdate,
(
select efv.value
from extrafieldvalue efv
where efv.orderid = o.id
and efv.extrafieldid = (select id from extrafield where columnname = 'AdditionalInfo')
) as additionalinfo,
(
select efv.value
from extrafieldvalue efv
where efv.orderid = o.id
and efv.extrafieldid = (select id from extrafield where columnname = 'Notes')
) as notes
from orders o;
如果您不知道要选择哪些额外的列,请选择所有内容,然后使用应用程序或网页的编程语言找出要显示的列。最终在PIVOT中找到了我的答案。这可能不是最好的方法,但却能满足我的需要。 这是我为任何有类似问题的人提出的问题 必须首先从extrafield表中获取所有不同的列名称,然后对所需的查询应用pivot
DECLARE
@Columns as VARCHAR(MAX),
@SQL as VARCHAR(MAX)
SELECT @Columns =
COALESCE(@Columns + ', ','') + QUOTENAME(Name)
FROM
(SELECT DISTINCT Name
FROM ExtraField
where ClientId=@CompanyID
) AS F
ORDER BY F.Name
SET @SQL = 'SELECT RequestedDate,Description, ' + @Columns + '
FROM
(
SELECT order.Created as RequestedDate,
order.Description as Description,
ExtraFieldValue.value AS Value,
ExtraField.Name as Name
FROM
order
left join ExtraFieldValue on ExtraFieldValue.OderID=Order.ID
left JOIN ExtraField ON ExtraField.Id = ExtraFieldValue.ExtraFieldID
) as PivotData
PIVOT
(
Max(Value)
FOR Name IN (' + @Columns + ')
) AS PivotResult'
exec(@sql)
终于在PIVOT中找到了我的答案。这可能不是最好的方法,但却能满足我的需要。 这是我为任何有类似问题的人提出的问题 必须首先从extrafield表中获取所有不同的列名称,然后对所需的查询应用pivot
DECLARE
@Columns as VARCHAR(MAX),
@SQL as VARCHAR(MAX)
SELECT @Columns =
COALESCE(@Columns + ', ','') + QUOTENAME(Name)
FROM
(SELECT DISTINCT Name
FROM ExtraField
where ClientId=@CompanyID
) AS F
ORDER BY F.Name
SET @SQL = 'SELECT RequestedDate,Description, ' + @Columns + '
FROM
(
SELECT order.Created as RequestedDate,
order.Description as Description,
ExtraFieldValue.value AS Value,
ExtraField.Name as Name
FROM
order
left join ExtraFieldValue on ExtraFieldValue.OderID=Order.ID
left JOIN ExtraField ON ExtraField.Id = ExtraFieldValue.ExtraFieldID
) as PivotData
PIVOT
(
Max(Value)
FOR Name IN (' + @Columns + ')
) AS PivotResult'
exec(@sql)
请分享这三个表格的样本数据和期望的结果。这里的关系很难理解。我添加了一些示例数据,希望这有助于更好地理解我的问题。请分享这三个表的示例数据和期望的结果。这里的关系很难理解。我添加了一些示例数据,希望这有助于更好地理解我的问题。