如何在SQL Server中仅选择每个外键的第一条记录?
联系人详细信息数据库中的行如下所示:如何在SQL Server中仅选择每个外键的第一条记录?,sql,sql-server,sql-server-2005,join,Sql,Sql Server,Sql Server 2005,Join,联系人详细信息数据库中的行如下所示: contactID - bioID - AddressLine1 - City 393 1 1 nowhere st toronto 3921 1 2 somewhere st vancouver 3231 2 1 anywhere rd barrie 1122 2 2 overthere st halifax bioid f
contactID - bioID - AddressLine1 - City
393 1 1 nowhere st toronto
3921 1 2 somewhere st vancouver
3231 2 1 anywhere rd barrie
1122 2 2 overthere st halifax
bioid firstname lastname addressline1 city
1 some guy 1 nowhere st toronto
1 some guy 2 somewhere st vancouver
2 that girl 1 anywhere rd barrie
2 that girl 2 overthere st halifax
bioid firstname lastname addressline1x1 cityx1 addressline1x2 cityx2
1 some guy 1 nowhere st toronto 2 somewhere st vancouver
2 that girl 1 anywhere rd barrie 2 overthere st halifax
我目前正在将其内部连接到一个bio表,该表包含firstname、lastname等列,结果如下所示:
contactID - bioID - AddressLine1 - City
393 1 1 nowhere st toronto
3921 1 2 somewhere st vancouver
3231 2 1 anywhere rd barrie
1122 2 2 overthere st halifax
bioid firstname lastname addressline1 city
1 some guy 1 nowhere st toronto
1 some guy 2 somewhere st vancouver
2 that girl 1 anywhere rd barrie
2 that girl 2 overthere st halifax
bioid firstname lastname addressline1x1 cityx1 addressline1x2 cityx2
1 some guy 1 nowhere st toronto 2 somewhere st vancouver
2 that girl 1 anywhere rd barrie 2 overthere st halifax
因此,我基本上得到了每个生物2行。是否还有其他方法,我可以选择全部作为一行,如下所示:
contactID - bioID - AddressLine1 - City
393 1 1 nowhere st toronto
3921 1 2 somewhere st vancouver
3231 2 1 anywhere rd barrie
1122 2 2 overthere st halifax
bioid firstname lastname addressline1 city
1 some guy 1 nowhere st toronto
1 some guy 2 somewhere st vancouver
2 that girl 1 anywhere rd barrie
2 that girl 2 overthere st halifax
bioid firstname lastname addressline1x1 cityx1 addressline1x2 cityx2
1 some guy 1 nowhere st toronto 2 somewhere st vancouver
2 that girl 1 anywhere rd barrie 2 overthere st halifax
感谢您的帮助
谢谢,
托马斯
编辑:
多亏了丹尼斯和贾斯汀,我才解决了这个问题。然而,现在我有另一个
我想实际选择地址作为1个字段,例如:
bioid firstname lastname primary address secondary address
1 some guy 1 nowhere st, toronto 2 somewhere st, vanvouver
2 that girl 1 anywhere rd, barrie 2 overthere st, halifax
我知道我可以通过连接以下列来实现:
cd1.addressline1 + ', ' cd1.city AS 'Primary Address'
但是,有些字段在记录中是空的,例如,如果没有辅助地址,那么如何使辅助地址不输出“,”?字段是空字符串,不是空值
再次感谢
编辑:我通过以下方式实现了此功能:
STUFF(COALESCE(', ' + NULLIF(C1.[AddressLine1], ''), '') +
COALESCE(', ' + NULLIF(C1.[AddressLine2], ''), '') +
COALESCE(', ' + NULLIF(C1.[City], ''), '') +
COALESCE(', ' + NULLIF(C1.[State], ''), '') +
COALESCE(', ' + NULLIF(C1.[Country], ''), '') +
COALESCE(', ' + NULLIF(C1.[ZipCode], ''), ''),1, 1, '') AS 'Primary Address'
你可以试试看。如果您知道用户将拥有多少地址,Pivot表就可以工作。但是,如果您知道您可能也可以对其进行硬编码:,那么CTE将为未知数量的地址工作,但是,它不会创建多个列,而是创建一个逗号分隔的列表
无论采用哪种方式,您都可能需要利用创建唯一性顺序
以下是递归CTE的工作示例:
SELECT *, ROW_NUMBER() OVER(PARTITION BY bioid ORDER BY contactid) AS rownum
INTO #TableToRecurse
FROMContactDetails
;WITH FinalOutput AS
(
--Anchor row of recursion
SELECT bioid, firstname, lastname, addressline, city, rownum
FROM #TableToRecurse
WHERE rownum = 1
UNION ALL
--Recursion piece
SELECT tr.bioid, tr.firstname, tr.lastname,
FinalOutput.addressline + ', ' + tr.addressline, FinalOutput.city + ', ' + tr.city, tr.rownum
FROM #TableToRecurse AS tr
JOIN FinalOutput
ON FinalOutput.bioid = tr.bioid AND FinalOutput.rownum = tr.rownum +1
)
--Final output only showing the last row (Max)
--Which should have everything concatenated together
SELECT FinalOutput.bioid, FinalOutput.firstname, FinalOutput.lastname,
FinalOutput.addressline, FinalOutput.city
FROM FinalOutput
JOIN
(
SELECT MAX(rownum) AS MaxRowNum, bioid
FROM FinalOutput
GROUP BY bioid
) AS MaxForEach
ON FinalOutput.bioid = MaxForEach.bioid
AND FinalOutput.rownum = MaxForEach.MaxRowNum
PIVOT将起作用,但不清楚该关注什么。我可以用排号来做这个。耶,我在想,但忘了记下来。谢谢,它已经更新了。有没有期待的例子?它不应该是递归选择中的tr.rownum+1吗?非常感谢您的输入,我非常感谢!我最后使用了下面的示例,因为我知道只有2个记录/bioID,他有一个更快的示例,我可以很容易地集成到一个500行的大型存储过程中。只有当他假设只有3个地址时,这才有效。如果有更多的地址,那么他将丢失数据。@JustinPihony OP只要求两个地址,我给他三个地址和一种添加更多地址的方法是的,OP在示例数据中说有2个,但这不一定是正确的requirements@JustinPihony别想zebras@JustinPihony你总是可以按城市的生物ID顺序添加稠密的分区,地址行,我将在我的脚本中这样做,如果你在不同的城市有相同的地址怎么办?您的查询不会返回此人。如果那个人没有联系方式怎么办?@Denisvalev我给了他一个方法。如果是更好或最好的,我相信会有更好的解决方案,但他可以从这里得到想法并继续。OP说有两个表格,一个是ContactDetails,另一个是Bio;据我所知,你只有一个答案。我同意,提供一半的答案总是更好的。