Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server如何构造子查询以将字段描述连接到ID_Sql Server_Join_Subquery - Fatal编程技术网

Sql server SQL Server如何构造子查询以将字段描述连接到ID

Sql server SQL Server如何构造子查询以将字段描述连接到ID,sql-server,join,subquery,Sql Server,Join,Subquery,我试图返回结果,用更具可读性的描述值替换记录ID。通过AS更改列名非常简单,但我认为需要一个子查询来获取ID值,如PT1,并获取描述值作为替换 例如,我有一个table1,其中有一些列,如: id |纸张|涂层| CreatedOn |类型 1 | pid3 | cid5 |某个日期| tid2 2 | pid2 | cid8 |某个日期| tid3 3 | pid1 | cid1 |某日| tid4 然后,表2给出了父表中引用id的详细信息: id | fKey |描述| 1 | pid3 |

我试图返回结果,用更具可读性的描述值替换记录ID。通过AS更改列名非常简单,但我认为需要一个子查询来获取ID值,如PT1,并获取描述值作为替换

例如,我有一个table1,其中有一些列,如:

id |纸张|涂层| CreatedOn |类型 1 | pid3 | cid5 |某个日期| tid2 2 | pid2 | cid8 |某个日期| tid3 3 | pid1 | cid1 |某日| tid4

然后,表2给出了父表中引用id的详细信息:

id | fKey |描述| 1 | pid3 |一些用户友好的描述| 1 | pid1 |其他一些描述| 1 | pid2 |其他东西|

表三和表四也类似

我尝试使用连接链接纸张ID,但未返回任何值

选择表1.纸张作为“纸张名称”,表1.涂层,表1.CreatedOn,表1.类型,表2.description 来自表1 将表2连接到表1上。纸张=表2.fKey

我的实际查询如图所示,但表名已更改:

SELECT PD_ComboRun.RNId AS 'RUN #', PD_ComboRun.RNQty AS Quantity,
       PD_ComboRun.PTId, PD_ComboRun.PSId AS Size, PD_ComboRun.RNType AS 'Run Type',
       PD_ComboRun.PCId AS 'Press Coating', PD_ComboRun.UVFid AS 'UV Finish',
       PD_ComboRun.Notes AS 'Special Instructions', PD_ComboRun.CreatedOn AS 'Date Created', 
       SM_PaperType.PTCode AS Paper, SM_PaperType.PTId AS Expr1
FROM  PD_ComboRun 
LEFT JOIN SM_PaperType ON SM_PaperType.PTId = PD_ComboRun.PTId
有人能告诉我实现这个目标的正确方向吗?谢谢

FROM  Table1 LEFT JOIN Table2 ON Table2.PTId = Table1.PCId

这看起来像支冒烟的枪,是不是应该放在桌子上?鉴于表2中的样本数据,仅显示了PTId的值,即。也许您正在创建一个通用表,但是如果是这种情况,那么应该重命名表2中的“FK”,这样它就不会与表1冲突

我想这是你需要的。我修改它以使用您的表和字段

DECLARE @PD_ComboRun TABLE(RNId int,RNQty int,PTId varchar(10),
    PSId varchar(10),PCId varchar(10),UVFid varchar(10),createdOn smalldatetime, 
    RNType varchar(10),Notes varchar(MAX))
INSERT INTO @PD_ComboRun
SELECT 1,5,'pid3','psid1','cid5','uvid1',GETDATE(),'tid2',''
UNION ALL
SELECT 2,10,'pid2','psid2','cid8','uvid4',GETDATE(),'tid3','notes'
UNION ALL
SELECT 3,7,'pid1','psid1','cid1','uvid1',GETDATE(),'tid4',''

SELECT * FROM @PD_ComboRun

DECLARE @SM_PaperType TABLE(PTId varchar(10),PTCode varchar(50))
INSERT INTO @SM_PaperType
SELECT 'pid3','some user friendly description'
UNION ALL
SELECT 'pid2','some other description'
UNION ALL
SELECT 'pid1','something else'

SELECT * FROM @SM_PaperType

SELECT t1.RNId AS [Run #], t1.RNQty AS Quantity,
    t1.PTId,t1.PSId AS Size,t1.RNType AS [Run Type], 
    t1.PCId AS [Press Coating], t1.UVFid AS 'UV Finish', 
    t1.Notes AS 'Special Instructions',t1.createdOn AS 'Date Created',
    t2.PTCode AS Paper,t2.PTId AS Expr1
FROM @PD_ComboRun t1 INNER JOIN @SM_PaperType t2 ON t1.PTId=t2.PTId
结果

@表1

1   5   pid3    psid1   cid5    uvid1   2012-05-31 17:45:00 tid2    
2   10  pid2    psid2   cid8    uvid4   2012-05-31 17:45:00 tid3    notes
3   7   pid1    psid1   cid1    uvid1   2012-05-31 17:45:00 tid4    
@表2

pid3    some user friendly description
pid2    some other description
pid1    something else
@合二为一

您可能需要重新考虑在表2中设置一个单独的id列。根据您的描述,似乎fKey确实是id。一个好的测试是,该值是否会在表2中重复。如果不是,则它应该是该表的主键,因为表2包含纸张的详细信息,而表1只是通过纸张id链接到它。我已经更新了实际查询以显示实际值。我希望使用的连接不会返回任何值,但是使用父表PD_ComboRun和PTId的it paper type列的逻辑应该能够通过链接SM_PaperType.PTId=PD_ComboRun.ptidt从同级表SM_PaperType中提取PTCode值。这真的很有帮助。事实证明,DB实际上绑定到了另一个字段值,而不是预期的fKey。问题解决了!感谢所有的贡献!!!