Sql 如何使用多个联接从select查询创建结果集,并从存在某些值的未链接表中提取值

Sql 如何使用多个联接从select查询创建结果集,并从存在某些值的未链接表中提取值,sql,sql-server,Sql,Sql Server,我有一个包含数据集合值的表。因此,值字段包含多种类型的数据-日期、数字和文本。集合中的一个字段是另一个未链接表的查找 我可以找出集合的select,但无法确定如何从未链接的表中提取值 SELECT DISTINCT CFV.Value, CFV.CustomRecordsetId, CFV.CustomFieldId, CF.Name, F.id, F.ShortFileName, F.DateFileOpen FROM [DB].[dbo].[CustomFi

我有一个包含数据集合值的表。因此,值字段包含多种类型的数据-日期、数字和文本。集合中的一个字段是另一个未链接表的查找

我可以找出集合的select,但无法确定如何从未链接的表中提取值

SELECT DISTINCT CFV.Value, CFV.CustomRecordsetId, CFV.CustomFieldId, 
                CF.Name, F.id, F.ShortFileName, F.DateFileOpen
FROM [DB].[dbo].[CustomFieldValue] CFV
        inner join [DB].[dbo].[CustomField] CF on cfv.customfieldId=cf.id
        inner join [DB].[dbo].[CustomRecordset] CRS on CRS.Id=CFV.CustomRecordsetId
        inner join [DB].[dbo].[File] F on F.Id=CRS.RecordId                              
WHERE F.Id = 27519
 AND  CF.Id = CFV.CustomFieldId
 AND  CF.CustomFieldTypeId <> 23 
 AND  CRS.customrecordid = 8
 AND (cf.name = 'MedLienAcctNo' 
       OR cf.name = 'MedLienAmountBilled1' OR cf.name = 'MedLienAmt' 
       OR cf.name = 'MedLienAmtDue' OR cf.name = 'MedLienDateRec' 
       OR cf.name = 'MedLienDiagAmt' OR cf.name = 'MedLienListTF1' 
       OR cf.name = 'MedLienLKUPMedProvider1' OR cf.name = 'MedLienNotes' 
       OR cf.name = 'MedLienServFromDate1' 
       OR cf.name = 'MedLienServToDate1' 
       OR cf.name = 'MedLienTreatAmt')
选择不同的CFV.Value、CFV.CustomRecordsetId、CFV.CustomFieldId、,
CF.Name、F.id、F.ShortFileName、F.DateFileOpen
来自[DB].[dbo].[CustomFieldValue]CFV
cfv上的内部联接[DB].[dbo].[CustomField]CF.customfieldId=CF.id
CRS上的内部联接[DB].[dbo].[CustomRecordset]CRS.Id=CFV.CustomRecordsetId
F.Id=CRS.RecordId上的内部联接[DB].[dbo].[File]F
其中F.Id=27519
和CF.Id=CFV.CustomFieldId
和CF.CustomFieldTypeId 23
和CRS.customrecordid=8
和(cf.name='medliancctno'
或cf.name='medlianamountbiled1'或cf.name='medlianamt'
或cf.name='MedLienAmtDue'或cf.name='MedLienDateRec'
或cf.name='MEDLIEDIAGAMT'或cf.name='MEDLIENISTF1'
或cf.name='medlinelkupmedprovider1'或cf.name='medlinenotes'
或cf.name='MedLienServFromDate1'
或cf.name='MedLienServToDate1'
或cf.name='MedLienTreatAmt')
我需要能够仅提取“MedLienkUpMedProvider1”的数据,并在未链接的人员表中查找名称字段,即People.name,其中
'MedLienkUpMedProvider1'=People.Id

选择不同的CFV.Value、CFV.CustomRecordsetId、CFV.CustomFieldId,
SELECT DISTINCT CFV.Value, CFV.CustomRecordsetId, CFV.CustomFieldId, 
                CF.Name, F.id, F.ShortFileName, F.DateFileOpen,
                p.SomeFieldName
FROM [DB].[dbo].[CustomFieldValue] CFV
        inner join [DB].[dbo].[CustomField] CF on cfv.customfieldId=cf.id
        inner join [DB].[dbo].[CustomRecordset] CRS on CRS.Id=CFV.CustomRecordsetId
        inner join [DB].[dbo].[File] F on F.Id=CRS.RecordId
        left outer join [DB].[dbo].[People] p on cf.name = p.Id and cf.name = 'MedLienLKUPMedProvider1'
WHERE F.Id = 27519
 AND  CF.Id = CFV.CustomFieldId
 AND  CF.CustomFieldTypeId <> 23 
 AND  CRS.customrecordid = 8
 AND  cf.name IN ('MedLienAcctNo', 'MedLienAmountBilled1', 'MedLienAmt', 'MedLienAmtDue', 'MedLienDateRec',
      'MedLienDiagAmt', 'MedLienListTF1', 'MedLienLKUPMedProvider1', 'MedLienNotes', 'MedLienServFromDate1',
      'MedLienServToDate1', 'MedLienTreatAmt')
CF.Name、F.id、F.ShortFileName、F.DateFileOpen、, p、 SomeFieldName 来自[DB].[dbo].[CustomFieldValue]CFV cfv上的内部联接[DB].[dbo].[CustomField]CF.customfieldId=CF.id CRS上的内部联接[DB].[dbo].[CustomRecordset]CRS.Id=CFV.CustomRecordsetId F.Id=CRS.RecordId上的内部联接[DB].[dbo].[File]F cf.name=p.Id和cf.name='medlinelkupmedprovider1'上的左外部联接[DB].[dbo].[People]p 其中F.Id=27519 和CF.Id=CFV.CustomFieldId 和CF.CustomFieldTypeId 23 和CRS.customrecordid=8 以及('MEDLIENACTNO','MEDLIENAMOUNTBILED1','MedLienAmt','MedLienAmtDue','MEDLIENAMDATEREC'中的cf.name, “MedLienDiagAmt”、“MedLienListTF1”、“MedLienLKUPMedProvider1”、“MedLienNotes”、“MedLienServFromDate1”, “MedLientServToDate 1”、“MedLientTreatAmt”)
这是你想要的吗?当cf.name中的值和People.Id字段之间存在链接时,很难判断“unlinked People table”是什么意思

“cf.name in(…)”限制非常糟糕。看起来您应该将该信息放入另一个表中,该表表示数据之间的关系。可能类似于CfName varchar(50),Category varchar(50)。如果您有类似的查询,那么您可以将查询与该表链接,并做出有用的限制,解释查询的全部内容,例如“where OtherTable.Category='Medical financials'”。这也意味着,当结果集中还有一种类型的类别时,在表中插入一行,而不是修改代码。您可能会在数据库中的其他位置使用此数据集限制,因此单行更新可能会为您节省大量代码更新


正如JNK所说,“通用”字段是个坏主意,原因很多。有意义地表达您正在管理的数据的表格设计将为您省去很多麻烦。

谢谢。我在FROM中使用了一个子查询,但它只允许提取一个字段,所以这可能会更好。我确实尝试了一个内部连接,但不断得到一个错误,即无法将varchar转换为值为2010-01-01(示例)的int,因此我放弃并转到子查询。使用相同的代码,但它工作。我会试试你的,然后公布结果

不幸的是,客户端使用的是第三方COTS数据库,因此我无法修改表结构。它也不允许我在报告时从Crystal创建临时表


我感谢您的反馈和解决方案。

准备好接受大量关于您的桌子设计的反馈!一般来说,使用一个“通用”字段来保存任何类型的值都不是一个好主意。