sql 读取数组问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 读取数组问题相关的知识,希望对你有一定的参考价值。

有两个有关联的表,表1是保存商品分类,表2是商品信息内容,因为每个商品对应的分类不是唯一的,如《ASP数据库完全开发手册》这本书又可以放到,“数据库”分类里,又可以放到“ASP”分类里。请问用sql语句怎么查询对应两个表关联的数据?如下是数据结构和要求生成的结果

id name
1 数据库
2 ASP
3 php
4 JSP

ID BookName TypeCode
1 ASP数据库开发 1,2
2 PHP数据库开发 1,2

查询结果如以
ASP数据库开发 数据库,ASP
PHP数据库开发 数据库,PHP
表2内容错了,改正一下

ID BookName TypeCode
1 ASP数据库开发 1,2
2 PHP数据库开发 1,3

mssql数据库

参考技术A 我以前也用这种方式,如果在数据库里查询,就要用到游标,如果在程序里就要用到循环.
我现在遇到这种情况,就把它改成三张表,一张商品表,一张分类表,一张是商品与分类对应表,这样处理起来更方便
参考技术B 表设计有问题.不符合第2范式.所以查询起来比较麻烦.
如果增加一个表存放TypeCode 和BOOKID对应关系 就容易做了.
现在很麻烦.不过可以用个循环语句取出单个.TypeCode
----------------------为防审核---稍候贴答案----------------
declare @a int
,@b varchar(100)
,@c int
,@d int
declare mycursor cursor fast_forward
for select [id] from 表2
open mycursor
fetch mycursor into @d
set @a=0
set @c=1
set @b=''
while @@fetch_status=0
begin
while @c<=(select count(*) from 表1)
begin
select @a=substring(TypeCode,@c,1) from 表2
set @b=@b+(select [name] from 表1 where [id]=@a)+','
set @c=@c+2
end
fetch mycursor into @d
end
close mycursor
deallocate mycursor
set @b=left(@b,len(@b)-1)
set @b= 'select [ID],bookname '+ @b + ' from 表2'
EXEC (@b)
--越写越感觉麻烦.
参考技术C sql server啊,不太可能实现你说的查询结果,如果硬要实现,就得用到存储过程或是函数,但是哪样的效率就变低了。

你用下面这段查询,看一下它的结果,你就明白,你的ASP应该怎么写了。查询结果和你要的差不多的。

select table1.id,table1.name,table2.bookname,typecode from table1 left join table2
on table2.typecode like '%'+cast(table1.id as varchar(10))+'%'
---------------------
是access还是sql server?本回答被提问者采纳
参考技术D 首先,查询语句并不要求主键与外键,对于任何表结构的任何字段,本语句均可以正确执行。

其次,这样语句中主键与外键的要求,是根据一般关系数据库的实体含义得出的,比如你这个学生和选课表,学号就自然应该是学生表的主键、选课表的外键。

第三,为了语句的效率,这样种形式的语句一般要求学号在两个表中均有索引。
第5个回答  2008-04-16 不赞同楼上的说法,这种设计在现实很正常,但是一般看到的处理方式都是放到编程语言层上来实现的,不知道在数据库层能不能按楼主的方式处理,我也很期待答案

读取多级 XML 文件

【中文标题】读取多级 XML 文件【英文标题】:Reading Multi Level XML File 【发布时间】:2021-06-07 09:03:01 【问题描述】:

我有一个 XML 文件,其中包含有关航行的所有信息和所有详细信息。

我想读取XML文件中的所有记录,合并记录后我想将它写入SQL数据库。

到目前为止,我安排将 header 、 company 和 voyage 放入数组,但将所有记录的详细信息放入数组中我失败了。

这是我要处理的任务:

通过 FileDialog 选择并读取任何 XML 数据到 RAM(已完成) 创建数组并将 XML 数据读取到数组(部分完成) 将 XML 数据写入 DataView(部分完成) 创建 T-SQL INSERT 命令(部分完成) 将数据写入数据库(等待完成早期步骤)

从 XML 读取到 DataView 时,我可以将数据存入内存,但无法按要求分离多级数据。

确切的问题是尝试在我收到的每个 XML 文件中处理不同级别的 XML 数据。

foreach (var child in childElem.Elements("ManifestData"))
            
                foreach(var x in child.Elements())
                
                    var checkName = x.Name.ToString();

                    switch (checkName)
                    
                        case "Company":
                            Globals.Companys.Clear();
                            foreach (var y in x.Elements())
                            
                                Globals.Companys.Add(y.Name.ToString(), y.Value.ToString());
                            
                            break;
                        case "Voyage":
                            Globals.Voyages.Clear();
                            foreach (var y in x.Elements())
                            
                                Globals.Voyages.Add(y.Name.ToString(), y.Value.ToString());
                            
                            break;
                        case "BLs":
                            int recs = 0;

                            Globals.BL.Clear();
                            textBox2.Clear();

                            foreach (var y in x.Elements())
                            
                                
                                
                                   foreach (var z in x.Elements("units"))
                                   
                                       Globals.Units.Add(y.Element("number").Value.ToString(), z.Value.ToString());

                                   

                                Globals.BL.Add(y.Element("number").Value.ToString(), y.Value.ToString());

                                recs = recs + 1;
                                textBox2.AppendText("\n" + y.ToString());


                                string output = string.Join("\n", Globals.BL);
                                MessageBox.Show(output);
                                

                            
                            break;
                        default:
                            break;
                    
                
            

在我的示例 XML 中,您看到有 3 个 BL,所有 BL 数据都有不同的级别。可能有数百个 BL,具有不同级别的货物和危险品。

我在这里处理多级 XML 数据时遇到问题。

如果你能帮我解决这个非常基本的问题,我会很高兴。我希望学习并留给人们了解如何为自己的数据库制作桌面 XML 阅读器应用程序。

这是XML Data 示例 您可以在这里找到所有来源:Project Reading XMLbyC#

【问题讨论】:

请提供Minimal, Reproducible Example,而不是您的整个代码库。这里没有人会扫描您的整个代码以查找错误,您必须提供您的尝试以及具体您遇到的问题。 " 将任何 XML 数据读取到 RAM" 请向我们展示此代码。查看您的 XML 后,它似乎可以由类结构表示。然后你需要它的唯一代码described here 其余的是从你的表示类访问变量并分发它们。 我修复了我的帖子,我应该注意到你的观点。 【参考方案1】:

xml 处理部分可以通过将 xml 反序列化为 c# 类来简化,然后您可以使用这些类来做任何您想做的事情。

[XmlRoot(ElementName = "ManifestMessage")]
public class ManifestMessage

    [XmlElement(ElementName = "Header")] 
    public Header Header  get; set; 

    [XmlElement(ElementName = "ManifestData")]
    public ManifestData ManifestData  get; set; 


[XmlRoot(ElementName = "Header")]
public class Header

    [XmlElement(ElementName = "sender")]
    public string Sender  get; set; 
    [XmlElement(ElementName = "reciever")] 
    public string Reciever  get; set; 

    [XmlElement(ElementName = "timeOfDocument")]
    public string TimeOfDocument  get; set; 

    [XmlElement(ElementName = "typeOfMessage")]
    public string TypeOfMessage  get; set; 



// Then when you want to get the xml deserialized into your class hierarchy


var xmlSerializer = new XmlSerializer(typeof(ManifestMessage));
var manifestMessage = xmlSerializer.Deserialize(data) as ManifestMessage;

// now you can use this object to drill down the whole hierarchy

Console.WriteLine(xmlData.Header.Sender);
Console.WriteLine(xmlData.ManifestData.Company.ComanyName);
Console.WriteLine(xmlData.ManifestData.Voyage.CrewNumber);
foreach (var bl in xmlData.ManifestData.BLs.BL)

    Console.WriteLine(bl.Collect);
    Console.WriteLine(bl.Consegnee.Name);
    Console.WriteLine(bl.Customer.Name);

您可以使用https://xmltocsharp.azurewebsites.net/ 站点从您的 xml 生成整个 c# 类层次结构。

Console.WriteLine 仅用于演示目的,您可以根据需要采用它。

【讨论】:

感谢您的链接!非常非常有用!投赞成票 感谢链接和代码,我会检查并尝试调整我的代码,但我试图弄清楚如果 xml 发生变化如何处理(可以在 BLs 中看到它们不同记录级别)。在我的示例中,它是货物和危险品。 您可以将 BLs 子项的所有不同组合添加到您的 xml 文件中,并让生成器为所有类生成类,但是您必须通过属性调整 xml 以使某些内容成为可选(如果它们是可选的)并不总是存在,例如[XmlRoot(ElementName = "AnotherBLChild", IsNullable = true)] 所以这是创建所有可能组合的最佳方式,当没有数据时,只需将 null 发送到数据库是一种选择;视野开阔。谢谢你的想法。 @melic 如果这回答了您的问题,请您标记答案。

以上是关于sql 读取数组问题的主要内容,如果未能解决你的问题,请参考以下文章

仅从 SQL 输出中读取一列作为 PHP 中的数值数组

无法从从 sql 数据库读取的 javascript 函数中获取返回数组 [重复]

Spark Sql 从 Hive orc 分区表中读取,给出数组越界异常

Oracle pl/sql 从物理目录中读取文件的内容

将JSON数组作为SQL表列之一读取

VBA研究用SQL语句读取EXCEL数据例程