Sql server 如何将联接表的字段值用于联接而不是外键

Sql server 如何将联接表的字段值用于联接而不是外键,sql-server,tsql,join,Sql Server,Tsql,Join,我需要查询一个新的数据库模式,如果不在联接中使用主键,我很难获取所需的数据。我没有设计模式,但我必须使用它。我尝试为此创建一个SQLFIDLE,但在我尝试时,它一直给我一个网关错误 基本上,我有一个联系人表,其中包含数据库中存储的所有联系人。“联系人”表包含两个字段,它们引用联系人链接到的表(供应商和客户)。联系人表还包含一个名为“ContactType”的字段。此链接指向定义联系人类型(所有者或雇员)的另一个表 我想做的是得到一份客户联系人的名单,他们是他们公司的所有者。这个SQl就是为了做到

我需要查询一个新的数据库模式,如果不在联接中使用主键,我很难获取所需的数据。我没有设计模式,但我必须使用它。我尝试为此创建一个SQLFIDLE,但在我尝试时,它一直给我一个网关错误

基本上,我有一个联系人表,其中包含数据库中存储的所有联系人。“联系人”表包含两个字段,它们引用联系人链接到的表(供应商和客户)。联系人表还包含一个名为“ContactType”的字段。此链接指向定义联系人类型(所有者或雇员)的另一个表

我想做的是得到一份客户联系人的名单,他们是他们公司的所有者。这个SQl就是为了做到这一点

SELECT 
  Contact.FirstName,
  Contact.LastName
FROM Client
LEFT JOIN Contact
  ON Client.ClientID = Contact.TableID 
  AND Contact.TableName = 'Client' 
  AND Contact.ContactTypeID = 1
这会给我

Bob Smith
Chris Brown
问题是我不想在加入中使用
和Contact.ContactTypeID=1
。我希望能够使用
Owner
Employee
代替
JOIN
ContactType
表的
主键(1或2)
,但我不确定如何做到这一点。请记住限制需要在
JOIN
中,因为我需要保留
WHERE
子句来过滤特定的客户端

例如,如果我想查询一个特定的供应商,并在同一行中获得所有者和雇员的列表,该怎么办

Vendor Name | Owner First | Owner Last | Employee First | Employee Last
============================================================================
ABC Produce |     Jill    |    Weston  |       Alice    |     Jenkins

我不确定我是否正确理解了您的问题,但如果我阅读正确,您希望有机会在
WHERE
子句中明确指定“所有者”或“雇员”,而不是
1
2

也许这就是你想要的:

SELECT 
  Contact.FirstName,
  Contact.LastName
FROM Client
LEFT JOIN Contact
  ON Client.ClientID = Contact.TableID 
  AND Contact.TableName = 'Client' 
LEFT JOIN ContactType ct ON ct.ContactTypeID = Contact.ContactTypeID
-- Now you can use it directly, as below
WHERE ct.Name = 'Owner'
编辑:回复您的评论

不是没有弄得一团糟。。。您可以使用派生的内联表或视图,但所有这些都是性能杀手。我能想到的最不影响性能(但仍然丑陋)的方式是:

SELECT 
  Contact.FirstName,
  Contact.LastName
FROM Client
LEFT JOIN Contact
  ON Client.ClientID = Contact.TableID 
  AND Contact.TableName = 'Client' 
  AND Contact.ContactTypeID = (SELECT iix.ContactTypeID FROM ContactType iix WHERE iix.Name = 'Owner')

我不确定我是否正确理解了您的问题,但如果我阅读正确,您希望有机会在
WHERE
子句中明确指定“所有者”或“雇员”,而不是
1
2

也许这就是你想要的:

SELECT 
  Contact.FirstName,
  Contact.LastName
FROM Client
LEFT JOIN Contact
  ON Client.ClientID = Contact.TableID 
  AND Contact.TableName = 'Client' 
LEFT JOIN ContactType ct ON ct.ContactTypeID = Contact.ContactTypeID
-- Now you can use it directly, as below
WHERE ct.Name = 'Owner'
编辑:回复您的评论

不是没有弄得一团糟。。。您可以使用派生的内联表或视图,但所有这些都是性能杀手。我能想到的最不影响性能(但仍然丑陋)的方式是:

SELECT 
  Contact.FirstName,
  Contact.LastName
FROM Client
LEFT JOIN Contact
  ON Client.ClientID = Contact.TableID 
  AND Contact.TableName = 'Client' 
  AND Contact.ContactTypeID = (SELECT iix.ContactTypeID FROM ContactType iix WHERE iix.Name = 'Owner')

我不确定我是否正确理解了您的问题,但如果我阅读正确,您希望有机会在
WHERE
子句中明确指定“所有者”或“雇员”,而不是
1
2

也许这就是你想要的:

SELECT 
  Contact.FirstName,
  Contact.LastName
FROM Client
LEFT JOIN Contact
  ON Client.ClientID = Contact.TableID 
  AND Contact.TableName = 'Client' 
LEFT JOIN ContactType ct ON ct.ContactTypeID = Contact.ContactTypeID
-- Now you can use it directly, as below
WHERE ct.Name = 'Owner'
编辑:回复您的评论

不是没有弄得一团糟。。。您可以使用派生的内联表或视图,但所有这些都是性能杀手。我能想到的最不影响性能(但仍然丑陋)的方式是:

SELECT 
  Contact.FirstName,
  Contact.LastName
FROM Client
LEFT JOIN Contact
  ON Client.ClientID = Contact.TableID 
  AND Contact.TableName = 'Client' 
  AND Contact.ContactTypeID = (SELECT iix.ContactTypeID FROM ContactType iix WHERE iix.Name = 'Owner')

我不确定我是否正确理解了您的问题,但如果我阅读正确,您希望有机会在
WHERE
子句中明确指定“所有者”或“雇员”,而不是
1
2

也许这就是你想要的:

SELECT 
  Contact.FirstName,
  Contact.LastName
FROM Client
LEFT JOIN Contact
  ON Client.ClientID = Contact.TableID 
  AND Contact.TableName = 'Client' 
LEFT JOIN ContactType ct ON ct.ContactTypeID = Contact.ContactTypeID
-- Now you can use it directly, as below
WHERE ct.Name = 'Owner'
编辑:回复您的评论

不是没有弄得一团糟。。。您可以使用派生的内联表或视图,但所有这些都是性能杀手。我能想到的最不影响性能(但仍然丑陋)的方式是:

SELECT 
  Contact.FirstName,
  Contact.LastName
FROM Client
LEFT JOIN Contact
  ON Client.ClientID = Contact.TableID 
  AND Contact.TableName = 'Client' 
  AND Contact.ContactTypeID = (SELECT iix.ContactTypeID FROM ContactType iix WHERE iix.Name = 'Owner')

你是对的,我正在努力完成。有没有办法在
JOIN
而不是
WHERE
子句中实现这一点?@webworm没有干净的方法。但请看我的编辑。你是正确的,我正在努力完成。有没有办法在
JOIN
而不是
WHERE
子句中实现这一点?@webworm没有干净的方法。但请看我的编辑。你是正确的,我正在努力完成。有没有办法在
JOIN
而不是
WHERE
子句中实现这一点?@webworm没有干净的方法。但请看我的编辑。你是正确的,我正在努力完成。有没有办法在
JOIN
而不是
WHERE
子句中实现这一点?@webworm没有干净的方法。但请看我的编辑。