【发布时间】:2014-10-05 10:27:36
【问题描述】:
我有两个具有一对多关系的表。表 A 有一个 ID 列,表 B 有一个 A_ID 列。
我希望我的输出包含表 A 中的每条记录一行。该行应该有一些来自 A 的值,但也有一些来自 B 中的行之一。对于表 A 中的每条记录,有 0、1 或B 中的更多记录 - 我希望能够对这些进行排序并只返回一个(例如,Z 列最大的记录)。
Table A - Artists
╔═════╦════════════════╦════════════════════════╗
║ ID ║ Artist ║ Real name ║
╠═════╬════════════════╬════════════════════════╣
║ 383 ║ Bob Dylan ║ Robert Allen Zimmerman ║
║ 395 ║ Marilyn Manson ║ Brian Hugh Warner ║
║ 402 ║ David Bowie ║ David Robert Jones ║
╚═════╩════════════════╩════════════════════════╝
Table B - Tracks
╔══════╦═══════════╦══════════════════════╦════════════════╗
║ ID ║ Artist_ID ║ Track Name ║ Chart position ║
╠══════╬═══════════╬══════════════════════╬════════════════╣
║ 1458 ║ 383 ║ Maggie's Farm ║ 22 ║
║ 1598 ║ 383 ║ Like a Rolling Stone ║ 4 ║
║ 1674 ║ 395 ║ Personal Jesus ║ 13 ║
║ 1782 ║ 383 ║ Lay Lady Lay ║ 5 ║
╚══════╩═══════════╩══════════════════════╩════════════════╝
以上面的表格为例,我们可能希望返回以下内容:
╔════════════════╦══════════════════════╦══════════╗
║ Artist ║ Top charting ║ Position ║
╠════════════════╬══════════════════════╬══════════╣
║ Bob Dylan ║ Like a Rolling Stone ║ 4 ║
║ Marilyn Manson ║ Personal Jesus ║ 13 ║
║ David Bowie ║ null ║ null ║
╚════════════════╩══════════════════════╩══════════╝
请注意,结果集包含来自子表的两列,但仅针对每个 Artist_ID 具有最小图表位置的行。 (而且由于可怜的老鲍伊在表 B 中没有任何轨道,因此他在子表的列中获取了空值。)
如果我想从 B 返回单个列,我会在 select 语句中使用子查询。 (我想我可以在 select 语句中包含多个子查询,但这可能会导致严重的性能损失并且看起来不太优雅。)
因为我需要从子查询中返回多个列,所以我可以用JOIN 来代替它,并将其视为一个表。不幸的是,这似乎导致我的输出中出现重复行 - 即当有多个子记录时,每个子记录在输出中都有一行。
解决这个问题的最佳方法是什么?
【问题讨论】:
标签: sql sql-server database join subquery