Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中仅选择每个外键的第一条记录?_Sql_Sql Server_Sql Server 2005_Join - Fatal编程技术网

如何在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;据我所知,你只有一个答案。我同意,提供一半的答案总是更好的。