我们有一个公司详细信息表和另一个与这些公司相关联的联系人表,因此每个公司可以有很多联系人。有人会通过联系人表格将每家公司的联系人减少到2。
然后,他们需要创建一个公司详细信息表,其中联系人表格中的每个联系人都在列的末尾添加,例如[Contact1Name],[Contact1Tel],[Contact2Name],[Contact2Tel]。
因此,他们将所有信息都放在一个表格/电子表格中,有没有办法通过tsql自动完成,还是必须手动完成?
每个联系人都通过公司ID栏链接到公司。
感谢您的帮助。
答案 0 :(得分:1)
您可以像这样提取数据:
WITH idList AS
(
SELECT CompanyID,
MIN(ContactID) as id1,
MAX(ContactId) as id2
FROM Contact GROUP BY CompanyID
)
SELECT c.*,c1.*,c2.*
FROM Company c
INNER JOIN idList ON c.CompanyID = idList.CompanyID
INNER JOIN Contact c1 ON c1.ContactId = idList.id1
INNER JOIN Contact c2 ON c2.ContactId = idList.id2
您将获得公司数据(c)和两个联系人(c1和c2)的数据
答案 1 :(得分:1)
我来自Oracle背景;但我喜欢这个美丽的解决方案。
按CONTACTS
按COMPANY_ID
订购记录,为每条记录分配一个唯一的编号,找到给每家公司的最小和最大编号,然后选择他们的两个相应记录:
WITH T AS
(
SELECT ROWNUM RN, C.* FROM
(SELECT CONTACTS.COMPANY_ID,
COMPANY.COMPANY_NAME,
CONTACTS.NAME,
CONTACTS.TEL
FROM CONTACTS, COMPANY
WHERE CONTACTS.COMPANY_ID = COMPANY.COMPANY_ID
ORDER BY CONTACTS.COMPANY_ID ) C
), R AS
(
SELECT COMPANY_NAME, MIN(RN) MINR, MAX(RN) MAXR FROM T
GROUP BY COMPANY_NAME
)
SELECT R.COMPANY_NAME, T1.NAME NAME1, T1.TEL TEL1,
T2.NAME NAME2, T2.TEL TEL2
FROM R, T T1, T T2
WHERE R.MINR = T1.RN and R.MAXR = T2.RN
答案 2 :(得分:0)
你正在做的事情被称为非规范化。这可能是一件好事(它确实使编写查询更容易。)
一种方法是为每个联系人分配一个行号。然后,您可以提取第一个和第二个联系人:
; with (
select row_number() over (partition by CompanyID
order by ContactName) as rn
, *
from OldTable
) as numbered_contacts
insert NewTable
(CompanyID, ContactName1, ContactTel1, ContactName2, ContactTel2)
select c1.CompanyID
, c1.ContactName as ContactName1
, c1.ContactTel as ContactTel1
, c2.ContactName as ContactName2
, c2.ContactTel as ContactTel2
from numbered_contacts c1
left join
numbered_contacts c2
on c1.CompanyID = c2.CompanyID
and c2.rn = 2 -- Second contact
where c1.rn = 1 -- Fist contact