【问题标题】:sqlite select query with foreign key for another tablesqlite select查询与另一个表的外键
【发布时间】:2015-11-23 17:56:59
【问题描述】:

我正在使用 sqlite.net 库使用 xamarin android 开发一个项目。我有一个选择查询,它将执行并创建一个名为 worker 的自定义对象集合:

var command = conn.CreateCommand("SELECT * FROM tblWorkers");
var results = command.ExecuteQuery<Worker>();
ObservableCollection<Worker> workers = new ObservableCollection<Worker>(results);
return workers;

其中一列是外键,我需要从该表中获取一个值,只是想知道最好的方法是什么。数据表 tblWorkers 上的外键是 TitleID 在该表上是一个 varchar(datatable : tblTitles column : Title - nvarchar) 我需要检索只是想知道最好的方法是什么?

【问题讨论】:

    标签: android sqlite xamarin sqlite.net


    【解决方案1】:
    var command = conn.CreateCommand("SELECT * FROM tblWorkers LEFT JOIN tblTitles ON tblWorkers.TitleID = tblTitles.id");
    

    现在,上述方法将起作用,但通常您会希望避免使用SELECT *。只获取您想要的字段。理想情况下,像这样......

    var command = conn.CreateCommand("SELECT tblWorkers.SomeFieldYouWant, tblWorkers.SomeOtherFieldYouWant, ... , tblTitles.Title FROM tblWorkers LEFT JOIN tblTitles ON tblWorkers.TitleID = tblTitles.id");
    

    【讨论】:

    • 我正在考虑使用连接。出于好奇,我为什么要避免使用 *?
    • 简短回答:性能。您不应该返回不需要的字段,因为您需要完成的工作比要求的要多。即使您现在正在使用每个字段,我个人仍然建议明确列出每个字段。设想一个未来,您为完全不相关的事物更改底层数据架构并添加 50 个新列。您的旧代码现在也将返回这些代码,并且您的应用程序的一部分已经运行多年并且没有被修改突然感觉更加缓慢。欲了解更多信息,请四处搜索 - 我已达到字符数限制!
    • 好的,我知道了。顺便说一句,我收到了一个列名不明确的错误:TitleID。
    • 很好的答案,以及关于性能的很好的解释。此外,@Bob'sBurgers 不明确的列名意味着 TitleID 存在于两个表中,并且您没有指定从哪个表中选择它。确保您的列列表包含 SELECT tblWorkers.titleID 而不仅仅是 SELECT TitleID
    • 啊,那么 TitleID 必须作为字段名存在于两个表中。也不是最佳实践,但可以通过使用TableName.FieldName 格式完全限定您想要的一个来解决。我会相应地在一秒钟内更新答案...
    猜你喜欢
    • 2023-04-08
    • 2014-11-25
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多