2017-04-12 108 views
0

我有一个返回某些特定数据的查询:添加行选择结果

SELECT sub.* 
    FROM (
Select item_id, field_id, attr_val from [CONTRACT_ATTR] where item_id in (select item_id from [CONTRACT_ATTR] where field_id = 326 and attr_val = 'Y') 
     ) sub 
WHERE field_id = 234 or field_id = 413 

enter image description here

值A750与在制造商表item_pk相关。我想从MFR表中取回item_name,并将其作为每个相关item_id的一行添加。所以16例如会有3行。而来自MRF的item_name将位于attr_val列中。

我现在最接近的是这是拉动item_name,但在错误的行,并删除我需要的其他领域。

SELECT sub.*, m.item_name 
    FROM (
Select item_id, field_id, attr_val from [CONTRACT_ATTR] where item_id in (select item_id from [CONTRACT_ATTR] where field_id = 326 and attr_val = 'Y') 
     ) sub 
JOIN MFR m 
ON m.item_pk = sub.attr_val and field_id = 234 

enter image description here

什么我做错了,我该如何解决?

编辑:

CREATE TABLE [dbo].[CONTRACT_ATTR](
    [ITEM_ID] [int] NOT NULL, 
    [FIELD_ID] [int] NOT NULL, 
    [ATTR_VAL] [varchar](500) NOT NULL, 
    [UPD_DTT] [datetime] NOT NULL, 
    [UPD_USR] [varchar](500) NOT NULL, 
CONSTRAINT [PK_CONTRACT_ATTR] PRIMARY KEY CLUSTERED 
(
    [ITEM_ID] ASC, 
    [FIELD_ID] ASC, 
    [ATTR_VAL] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 

CREATE TABLE [dbo].[MFR](
    [ITEM_ID] [int] IDENTITY(1,1) NOT NULL, 
    [ITEM_NAME] [varchar](500) NOT NULL, 
    [ADD_DTT] [datetime] NOT NULL, 
    [ADD_USR] [varchar](500) NOT NULL, 
    [UPD_DTT] [datetime] NOT NULL, 
    [UPD_USR] [varchar](500) NOT NULL, 
    [ACTIVE_IND] [char](1) NULL, 
    [ITEM_PK] [varchar](500) NULL, 
CONSTRAINT [PK_MFR] PRIMARY KEY CLUSTERED 
(
    [ITEM_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 
+0

请问您可以添加表格模式到您的问题? –

+0

超级快速文本表,从SSMS复制并粘贴到这里:https://senseful.github.io/web-tools/text-table/然后点击“Create Table”,然后将输出和格式复制为问题的代码。 – SqlZim

+0

是'[ITEM_PK]'唯一的吗? – SqlZim

回答

1

你可以使用outer apply()获得制造商名称,然后选择使用max() over()窗函数返回它的每item_id即使field_id234

select 
    c.item_id 
    , c.field_id 
    , c.attr_val 
    , m.item_name /* includes nulls when c.field_id is not 234 */ 
    , max(m.item_name) over (partition by c.item_id) as mfr_name 
from [CONTRACT_ATTR] c 
    outer apply (
    select top 1 i.item_name 
    from MFR i 
    where i.item_pk = c.attr_val 
     and c.field_id = 234 
) m 
where c.item_id in (
    select item_id 
    from [CONTRACT_ATTR] 
    where field_id = 326 
    and attr_val = 'Y' 
)