在SQLite中查询多个表时如何累积匹配?
表1 表2在SQLite中查询多个表时如何累积匹配?,sql,string,sqlite,group-by,inner-join,Sql,String,Sqlite,Group By,Inner Join,表1 表2 ID Name CourseID 1 Course 1 4002 2 Course 2 2342 3 Course 3 2410 当我尝试 CourseID ProfName 4002 John 2342 bob 2410 Bill 4002 Hannah 2342 Cyrus 我得到同一个CourseID的多个实例,当我打印出来时 “1,课程14002,约翰”和 “1,课程1400
ID Name CourseID
1 Course 1 4002
2 Course 2 2342
3 Course 3 2410
当我尝试
CourseID ProfName
4002 John
2342 bob
2410 Bill
4002 Hannah
2342 Cyrus
我得到同一个CourseID的多个实例,当我打印出来时
“1,课程14002,约翰”和
“1,课程14002,汉娜”是两个不同的输出
我希望他们的形式
“1,课程14002,约翰和汉娜”
不确定如何更改我的SQL查询以实现此目的?使用字符串聚合:
SELECT ID, Name, CourseID, ProfName
FROM Table1, Table2
WHERE Table1.CourseID = Table2.CourseID
请注意,这使用标准联接语法(join…on…
)而不是隐式联接(在from
子句中使用逗号):新代码中不应使用这种老式语法
您还可以使用子查询:
select t1.id, t1.name, t1.courseid, group_concat(t2.profname, ' and ') profnames
from table1 t1
inner join table2 t2 on t1.courseid = t2.courseid
group by t1.id, t1.name, t1.courseid
不相关的注意:
和
似乎不是列表分隔符的好选择:如果有两个以上的值,则结果不正确。例如,更常见的选择是逗号(,
)——这是SQLite和大多数其他数据库中的默认分隔符。我猜您希望大多数名称和和
之间只在最后一个名称之间使用逗号。这将是:
select t1.*
(
select group_concat(t2.profname, ' and ')
from table2 t2
where t2.courseid = t1.courseid
) profnames
from table1 t1
如果你有超过2个呢?我想显示完整的列表,例如“John,Hannah,Sarah,Joshua”等等。请在代码问题中给出一个--剪切粘贴&可运行代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。在总体目标上暂停工作,在第一个表达中删去代码,不要给出你期望的,说出你期望的,为什么。
select t1.*, t2.profnames
from table1 t1 join
(select t2.courseid,
(group_concat(case when seqnum > 1 then profname end) || ', and '
max(case when seqnum = 1 then profname end)
) as profnames
from (select t2.*,
row_number() over (partition by courseid order by profname desc) as seqnum,
from table2 t2
) t2
group by t2.courseid
) t2
on t1.courseid = t2.courseid;