Sql 选择文本值,而不是ID的内部连接另一个表

Sql 选择文本值,而不是ID的内部连接另一个表,sql,sql-server,join,Sql,Sql Server,Join,我现在有两个表,我正在尝试内部连接以获得一些文本值。我有一个保存数据的字段。用户可以从组合框/文本框中选择数据,然后进行保存,但我从组合框中保存的值是ID值,而不是文本值。现在,我尝试连接这些表,并获取文本值,而不是要在datagridview中显示的ID 这是我的桌子的样子 tbl1 OrigValue NewValue FieldName 12 13 Dept 17

我现在有两个表,我正在尝试内部连接以获得一些文本值。我有一个保存数据的字段。用户可以从组合框/文本框中选择数据,然后进行保存,但我从组合框中保存的值是ID值,而不是文本值。现在,我尝试连接这些表,并获取文本值,而不是要在datagridview中显示的ID

这是我的桌子的样子

tbl1
OrigValue             NewValue             FieldName
12                     13                   Dept
17                     18                   Position
9                      10                   Cost
Samm                   Sammy                Name

tblDefinitions
ID            Name                Field 
9             Microsoft           Seller
10            Adobe               Seller
12            Finance             Dept
13            Research            Dept
17            Manager             Position
18            Entry               Position
我想

Select * from tbl1 and inner Join tblDefitions to get text values
问题是,如果查看tbl1中的第3条记录,它会显示9和10,这两条记录可以在tblDefinitions中引用,但字段名不在tblDefinitions中。我尝试只连接字段名匹配的两个表,并按原样显示其他所有内容

期望的最终结果

OrigValue         NewValue       FieldName
Finance           Resarch        Dept
Manager           Entry          Position
9                 10             Cost

你必须加入两次TBL定义。外部联接,因为可能缺少匹配项。然后使用coalescect显示找到的值或默认值

select 
  coalesce(ov.name, cast(t1.origvalue as varchar)) as origvalue,
  coalesce(nv.name, cast(t1.newvalue as varchar)) as newvalue,
  t1.fieldname
from tbl1 t1
left join tbldefinitions ov on t1.origvalue = ov.id and t1.fieldname = ov.field
left join tbldefinitions nv on t1.newvalue = nv.id and t1.fieldname = nv.field;

这将匹配您的密钥,以便显示原始名称和新名称

SELECT tblDefinitions.Name AS 'Original Value', t.Name AS 'New Value', FieldName
FROM tbl1 
JOIN tblDefinitions ON tbl1.OrigValue = tblDefinitions.ID 
JOIN tblDefinitions t ON tbl1.NewValue = t.ID

但是,我不理解tbl1中的字段名和tblDefinitions中的字段之间的关系。

您没有将“tblDefinitions”两次与id列中的新旧值合并以获取其文本值

select 
        isnull(tdo.Name,cast(t1.OrigValue as varchar)) OrigValue         
       ,isnull(tdn.Name,cast(t1.NewValue as varchar)) NewValue
       ,t1.FieldName 
 from
    tbl1 t1
    left join tblDefinitions tdo on  t1.FieldName = tdo.Field and t1.OrigValue = tdo.ID
    left join tblDefinitions tdn on t1.FieldName = tdn.Field and t1.NewValue = tdn.Id 

9和10都出现在第二个表中,为什么第三行会像您在示例中提供的那样显示?我还想问一下,为什么要在表中包含不存在的FK?因为字段名不在TBL定义中。我只是尝试为tblDefinition中的字段名获取文本名值。如果字段名不匹配,则按原样显示值。Cost是一个文本框值,它不会像组合框那样以ID保存,需要以ID的形式显示。对于其他所有内容,我不想显示一个数字,因为它有一个对应的文本值。fieldname是新值还是旧值?@takarii所以发生的事情是tbl1是我插入所有更改的地方。因此,用户最初可能会保存Dept=12。然后他们更改记录并将其更改为Dept=13,如第一条记录tbl1所示。我把变化记录在这张表上。但是现在我试图实际显示原始值是什么,新值是什么-这样用户可以看到更改是什么。内部连接将正确地转换内容,但是如果键没有任何可引用的内容作为存在的内容,或者连接不会显示id。您的程序甚至不应该允许将不存在的键添加到数据库中。当我填充组合框时,我使用tblDefinitions中的id和名称。当用户选择并保存它时,我保存ID。稍后,如果用户更改值,我将原始值和新值保存在tbl1中。Field/FieldName在大多数情况下都会匹配,但在某些情况下,如果tbl1.Field=和tblDefinitions.FieldName不匹配,则我希望按基本情况显示数据。仅显示在tbl1中匹配的FieldName的文本值。FIELD@Bobski首先,我可能会尽量避免这种情况发生。如果没有参考点,数字绝对不能告诉用户任何信息——因此,如果在数据网格中显示所需的结果,用户将什么都不知道。也许审查您的应用程序并引入代码来阻止这种情况发生是明智的做法?这就是为什么我试图显示FieldName,这样如果他们使用FieldName=Cost,并且它显示原始值=9和新值=10,那么他们将知道成本已经改变。VS Dept或Position-一个数字不会告诉他们任何事情,因此如果我理解正确-如果fieldname是cost,则旧值/新值是对cost的具体更改,例如从10英镑更改为9英镑,与定义表中的ID无关,但如果是Dept,那么这些值是否与定义表中的名称字段相关?是,这是正确的。但在某些情况下……在这种情况下,如果与tblDefinitions连接,则成本值可能会拉取一个值,这就是为什么我试图找到一种方法,将ID和FieldName上的两个表连接在一起,以便只有这些值显示“Name”,并将FieldName不在字段中的所有其他字段保留为原样。不幸的是,我遇到了一个错误-它被卡住了在文本值上显示此错误…..将varchar值“JohnSmith”转换为数据类型int时,转换失败。这是我的OldValue列中的一个值,因此发生的情况是我的orig/new值可能有文本值,我猜当我们执行leftjoin并尝试t1.origvalue=ov.id时-它正在尝试将origvalue转换为类似的整数那是个糟糕的桌子设计。您仍然可以将:在t1.origvalue=castov.id上转换为varchar,在t1.newvalue=castnv.id上转换为varchar,这样就不再需要将t1.origvalue和t1.newvalue反向转换为number,因为您告诉DBMS比较字符串。是否有某种方法可以做到这一点,我指定如果fieldname为'dept'或'position',则在ID上执行内部联接,否则不执行内部联接否,我不这么认为,因为即使
您试图告诉DBMS首先检查字段名,然后查看orig/newvalue,结果可能正好相反。使用SQL,您可以告诉DBMS做什么,而不是如何做。您最好的选择是另一个数据库设计,但根据给定的设计,我建议将ID转换为varchar也应该有效。当您将join保留在t1上时。origValue=tdo.ID这会引发错误,因为某些origValue为textInner join将引发错误。。试试这个,它在工作是的,它在工作……我道歉。我还有一个问题。我在tbl1中有更多的值需要链接到另一个表-比如tbl1,但我只需要将其与ID链接-无需使用fldname。我该怎么做?你能给我举个例子吗?