通过 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 查询获取提到的输出的主要内容,如果未能解决你的问题,请参考以下文章

oracle动态查询通过sql获取游标变量

如何从 Java 中的 Oracle SQL 选择中获取原始脚本输出而不是查询结果

获取输出的 SQL 查询

SQL 通过多个 DELETE 查询获取文件中已删除行的总数

为我的 SQL 查询获取错误的输出 - 为啥会这样?

如何获取 sql 查询作为输出,如本图所示