2

在我的数据库中,我必须以一对多(可选)关系表1....0,*

Table1:
+--+---------+
|id|   name  |
+--+---------+
| 1|  user1  |
| 2|  user2  |
| 3|  user3  |
+--+---------+


Table2
+--+------+-------+
|id|tb1_ID|city   |
+--+------+-------+
| 1|   1  |  a    |
| 2|   1  |   b   |
| 3|   2  |   c   |
+--+------+-------+

现在我想要表 1 中的所有当前记录和表 2 的前 1 个元素(对于每个表 1 行)

喜欢

+----+------+----+--------+---------+
|p.id|p.name|c.id|c.tb1_ID|c.city   |
+----+------+----+--------+---------+
|  1 | user1|  1 |    1   |    a    |
|  2 | user2|  3 |    2   |    c    |
|  3 | user3|null|   null |   null  |
+----+------+----+--------+---------+

如何???

4

3 回答 3

2

例如使用这个WITH common_table_expressionROW_NUMBER函数:

WITH cte AS(
    SELECT  t1.id AS t1ID
    ,       t1.name 
    ,       t2.id AS t2ID
    ,       t2.tb1_ID
    ,       t2.city
    ,       ROW_NUMBER()OVER(Partition By t1.id Order By t2.id)AS t1RowNum
    FROM Table1 t1 LEFT OUTER JOIN Table2 t2 ON t1.id=t2.tb1_ID
)
SELECT cte.* 
FROM   cte 
WHERE  t1RowNum = 1
于 2012-05-14T11:35:07.717 回答
1

您必须使用带有 OUTER APPLY 的子查询来隔离右表中的单行。

select t1.*, t2.* 
from table1 t1 
outer apply
(
    select top 1 *
    from table2
    where tb1_id = t1.id
    order by id
) as t2
于 2012-05-14T11:35:35.817 回答
-1

假设您要使用 1 对多关系LEFT OUTER JOIN

SELECT p.id, p.name, c.id, c.tb1_ID, c.city
FROM Table1 p
LEFT OUTER JOIN Table2 c
ON p.id = c.tb1_ID

如果您有多对多,则需要决定如何限制表 2。

于 2012-05-14T11:32:49.110 回答