在SQL Server中搜索表两次
我已经多次遇到这个问题,我不知道如何解决它。我有一个查询,需要访问同一个表两次,以选择两个不同的人:顾问和客户联系人 顾问+客户查询如下所示在SQL Server中搜索表两次,sql,sql-server,Sql,Sql Server,我已经多次遇到这个问题,我不知道如何解决它。我有一个查询,需要访问同一个表两次,以选择两个不同的人:顾问和客户联系人 顾问+客户查询如下所示 select CRM7.contact.contact_id as CustomerID, CRM7.contact.name + ' ' + CRM7.person.firstname + ' ' + CRM7.person.LASTNAME as CustomerName, CRM7.person.firstname +
select
CRM7.contact.contact_id as CustomerID,
CRM7.contact.name + ' ' + CRM7.person.firstname + ' ' + CRM7.person.LASTNAME as CustomerName,
CRM7.person.firstname + ' ' + CRM7.person.lastname as ConsultantName,
CRM7.udcontactsmall.long08 as WriteLic,
CRM7.udcontactsmall.long17 as ReadLic,
CRM7.udcontactsmall.long09 as HasMaint,
CRM7.udlist.name as BCVer
from
CRM7.contact,
CRM7.udcontactsmall
left join
CRM7.associate on CRM7.udcontactsmall.long11 = CRM7.associate.associate_id
left join
CRM7.person on CRM7.associate.person_id = CRM7.person.person_id
left join
CRM7.udlist on CRM7.udcontactsmall.long07 = CRM7.udlist.UDList_id
where
CRM7.contact.category_idx = '2' and
CRM7.contact.userdef_id = CRM7.udcontactsmall.udcontactsmall_id
order by
CRM7.contact.name
SELECT
C.NAME+' Kontakt '+ P.FIRSTNAME+' '+P.LASTNAME AS CONTACT
FROM
CRM7.PERSON P
LEFT OUTER JOIN
CRM7.CONTACT C ON P.CONTACT_ID = C.CONTACT_ID
WHERE
C.CATEGORY_IDX IN ('2','5')
AND P.RETIRED = 0
ORDER BY
C.NAME, P.LASTNAME, P.FIRSTNAME
每个客户的联系方式如下所示
select
CRM7.contact.contact_id as CustomerID,
CRM7.contact.name + ' ' + CRM7.person.firstname + ' ' + CRM7.person.LASTNAME as CustomerName,
CRM7.person.firstname + ' ' + CRM7.person.lastname as ConsultantName,
CRM7.udcontactsmall.long08 as WriteLic,
CRM7.udcontactsmall.long17 as ReadLic,
CRM7.udcontactsmall.long09 as HasMaint,
CRM7.udlist.name as BCVer
from
CRM7.contact,
CRM7.udcontactsmall
left join
CRM7.associate on CRM7.udcontactsmall.long11 = CRM7.associate.associate_id
left join
CRM7.person on CRM7.associate.person_id = CRM7.person.person_id
left join
CRM7.udlist on CRM7.udcontactsmall.long07 = CRM7.udlist.UDList_id
where
CRM7.contact.category_idx = '2' and
CRM7.contact.userdef_id = CRM7.udcontactsmall.udcontactsmall_id
order by
CRM7.contact.name
SELECT
C.NAME+' Kontakt '+ P.FIRSTNAME+' '+P.LASTNAME AS CONTACT
FROM
CRM7.PERSON P
LEFT OUTER JOIN
CRM7.CONTACT C ON P.CONTACT_ID = C.CONTACT_ID
WHERE
C.CATEGORY_IDX IN ('2','5')
AND P.RETIRED = 0
ORDER BY
C.NAME, P.LASTNAME, P.FIRSTNAME
数据集:
如何获得同时返回客户顾问和客户联系人的查询?这应该符合您的目的:
select
CRM7.contact.contact_id as CustomerID
,CRM7.contact.name+' '+CRM7.person.firstname+' '+CRM7.person.LASTNAME as CustomerName
,CRM7.person.firstname+' '+CRM7.person.lastname as ConsultantName
,CRM7.udcontactsmall.long08 as WriteLic
,CRM7.udcontactsmall.long17 as ReadLic
,CRM7.udcontactsmall.long09 as HasMaint
,CRM7.udlist.name as BCVer
,C.NAME+' Kontakt '+ CRM7.person.FIRSTNAME+' '+ CRM7.person.LASTNAME AS CONTACT
from
CRM7.contact
,CRM7.udcontactsmall
left join CRM7.associate on CRM7.udcontactsmall.long11=CRM7.associate.associate_id
left join CRM7.person on CRM7.associate.person_id=CRM7.person.person_id
left join CRM7.udlist on CRM7.udcontactsmall.long07=CRM7.udlist.UDList_id
LEFT OUTER JOIN (SELECT CONTACT_ID,NAME FROM CRM7.CONTACT WHERE CATEGORY_IDX in ('2','5') AND P.RETIRED=0) C ON CRM7.person.CONTACT_ID=C.CONTACT_ID
where
CRM7.contact.category_idx='2'
and CRM7.contact.userdef_id=CRM7.udcontactsmall.udcontactsmall_id
order by
CRM7.contact.name
我使用了第二个查询中联系人表的联接,并将其添加到第一个查询中以获取客户联系人:
LEFT OUTER JOIN
(SELECT CONTACT_ID, NAME
FROM CRM7.CONTACT
WHERE CATEGORY_IDX IN ('2','5') AND P.RETIRED = 0) C ON CRM7.person.CONTACT_ID = C.CONTACT_ID
这应该符合你的目的:
select
CRM7.contact.contact_id as CustomerID
,CRM7.contact.name+' '+CRM7.person.firstname+' '+CRM7.person.LASTNAME as CustomerName
,CRM7.person.firstname+' '+CRM7.person.lastname as ConsultantName
,CRM7.udcontactsmall.long08 as WriteLic
,CRM7.udcontactsmall.long17 as ReadLic
,CRM7.udcontactsmall.long09 as HasMaint
,CRM7.udlist.name as BCVer
,C.NAME+' Kontakt '+ CRM7.person.FIRSTNAME+' '+ CRM7.person.LASTNAME AS CONTACT
from
CRM7.contact
,CRM7.udcontactsmall
left join CRM7.associate on CRM7.udcontactsmall.long11=CRM7.associate.associate_id
left join CRM7.person on CRM7.associate.person_id=CRM7.person.person_id
left join CRM7.udlist on CRM7.udcontactsmall.long07=CRM7.udlist.UDList_id
LEFT OUTER JOIN (SELECT CONTACT_ID,NAME FROM CRM7.CONTACT WHERE CATEGORY_IDX in ('2','5') AND P.RETIRED=0) C ON CRM7.person.CONTACT_ID=C.CONTACT_ID
where
CRM7.contact.category_idx='2'
and CRM7.contact.userdef_id=CRM7.udcontactsmall.udcontactsmall_id
order by
CRM7.contact.name
我使用了第二个查询中联系人表的联接,并将其添加到第一个查询中以获取客户联系人:
LEFT OUTER JOIN
(SELECT CONTACT_ID, NAME
FROM CRM7.CONTACT
WHERE CATEGORY_IDX IN ('2','5') AND P.RETIRED = 0) C ON CRM7.person.CONTACT_ID = C.CONTACT_ID
如果确实需要左连接,请不要将这些右侧表条件放在WHERE子句中。如果您这样做,您将获得内部连接行为。转到ON子句以获得真正的左连接执行。好奇为什么您将顾问和客户存储在同一个位置table@jarlh-如您所见,where子句对使用左联接联接的表没有任何条件,因此尽管您的语句为true,在这种情况下不会有任何效果。您确实需要停止使用旧式联接。较新的连接语法已经存在了25年多了。其中C.CATEGORY_IDX在'2'和'5'中。。。使左联接成为内部联接。如果确实需要左联接,请不要将这些右侧表条件放在WHERE子句中。如果您这样做,您将获得内部连接行为。转到ON子句以获得真正的左连接执行。好奇为什么您将顾问和客户存储在同一个位置table@jarlh-如您所见,where子句对使用左联接联接的表没有任何条件,因此尽管您的语句为true,在这种情况下不会有任何效果。您确实需要停止使用旧式联接。较新的连接语法已经存在了25年多了。其中C.CATEGORY_IDX在'2'和'5'中。。。使该左连接成为内部连接。嗨,我不需要左外部连接CRM7.CONTACT C ON P.CONTACT_ID=C.CONTACT_ID在该左外部连接中才能工作?是的,我现在知道了。它给出了一个错误无效的列名“Retired”-删除它会运行查询,并给出空值。按此方式尝试左外部联接选择联系人\u ID,来自CRM7的名称。联系人,其中类别\u IDX在“2”中,CRM7.person.CONTACT_ID=C.CONTACT_ID和CRM7.person.FIRSTNAME+''+CRM7.person.LASTNAME作为联系人这让我觉得顾问很好。我明白了为什么退休字段会出现错误。它属于不在子查询中的人。在我看来,它应该有效,我应该接待客户而不是顾问,但我只是再次得到顾问。是因为CRM7.person.CONTACT\u ID使用了旧值吗?嗨,我不需要左侧外部连接CRM7.CONTACT C ON P.CONTACT\u ID=C.CONTACT\u ID在该左侧外部连接中才能工作吗?是的,我现在明白了。它给出了一个错误无效的列名“Retired”-删除它会运行查询,并给出空值。按此方式尝试左外部联接选择联系人\u ID,来自CRM7的名称。联系人,其中类别\u IDX在“2”中,CRM7.person.CONTACT_ID=C.CONTACT_ID和CRM7.person.FIRSTNAME+''+CRM7.person.LASTNAME作为联系人这让我觉得顾问很好。我明白了为什么退休字段会出现错误。它属于不在子查询中的人。在我看来,它应该有效,我应该接待客户而不是顾问,但我只是再次得到顾问。是因为CRM7.person.CONTACT_ID使用了旧值吗?