通过 SQL 查询获取提到的输出
Posted
技术标签:
【中文标题】通过 SQL 查询获取提到的输出【英文标题】:Get the mentioned output by SQL query 【发布时间】:2018-02-01 18:13:22 【问题描述】:我最近参加了一次采访。面试官问我这个问题。 我有 2 张桌子:
第一个表是Location
,如下所示:
ID | City
---+-----------
1 | Mumbai
2 | Delhi
3 | Bangalore
第二张表是Item
,像这样:
Item | Location_id
-----+-------------
A | 1,2
B | 2,3
C | 1,2,3
现在我们想要如下的输出
Item | Location
-----+-------------------------
A | Mumbai,Delhi
B | Delhi,Bangalore
C | Mumbai,Delhi,Bangalore
请帮我写查询。
【问题讨论】:
这不是代码编写服务,当然也不是帮助您欺骗潜在雇主的服务。如果面试官允许你利用资源来回答你的问题(在这种情况下我很难接受),那么继续,但要这样说明。如果不是,请对面试官诚实。 我建议你阅读关于良好提问的 SO 指南:***.com/help/dont-ask 我假设你没有通过测试,这不是带回家的,想了解它应该如何工作?如果不是,那么您不应该让我们在这里帮助您,如果您在面试中不懂代码,如果您被录用,您将失败。 【参考方案1】:您可以使用以下查询。字符串拆分适用于 SQL Server 2016 及更高版本。
Select * into #temp
from #location l
join (
select item,value from #item
CROSS APPLY STRING_SPLIT(location_id, ',')
) A on l.id=a.value
select
item,
stuff((
select ',' + u.city
from #temp u
where u.item = A.item
for xml path('')
),1,1,'') as List
from #temp A
group
by item
Drop table #temp
【讨论】:
为什么要麻烦临时表和拆分字符串? 所有问题都可以有多种解决方案。其中之一可能不是最好的:) 你最后也忘了DROP #temp
是的..现在编辑。谢谢
你这里的代码好像不行,在SQLfiddle试了一下没有结果【参考方案2】:
你想STUFF
将所有匹配的结果归为一栏:
SELECT i.item,
STUFF((SELECT ',' + l.city
FROM location l
WHERE CHARINDEX(cast(l.id AS VARCHAR(4)),i.location_id)>0
FOR XML PATH ('')), 1, 1, '')
AS Location
FROM item i;
CHARINDEX
在字符串中查找子字符串的第一个实例,在这种情况下,它会发现您的 location_id 字符串中有数字 1 代表 Mumbai,2 代表 Dehli 等。
STUFF
将您的结果合并为一个结果。
SQLFiddle
更新 -
正如 Rajneesh 所指出的,这只是因为您的 ID 是个位数。字符串拆分可能是处理此类 ID 可能性的最佳方法。这仍然可以在这个查询中完成,而不需要临时表。
SELECT i.item,
STUFF((SELECT ',' + l.city
FROM location l
WHERE l.id IN (select value from STRING_SPLIT(i.location_id, ','))
FOR XML PATH ('')), 1, 1, '')
AS Location
FROM item i;
SQLFiddle
【讨论】:
用这些值测试你的代码 INSERT INTO Location(ID, City) Values(1, 'Mumbai'), (11,'Bangalore');插入项目(项目,location_id)值('B','11') @RajneeshVaishwar 它不适用于两位数的 ID,但它确实适用于提供的单个数字。以上是关于通过 SQL 查询获取提到的输出的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Java 中的 Oracle SQL 选择中获取原始脚本输出而不是查询结果