【问题标题】:(SQL) Select and return all from more than 2 tables that have a common field where a specific value is present in all tables(SQL) 从超过 2 个具有公共字段的表中选择并返回所有表,其中所有表中都存在特定值
【发布时间】:2017-07-27 09:52:38
【问题描述】:

如上所述,我希望结果是满足值的每个表中所有列的一行。所有表中的公共字段是主键。任何类型的 UNION 都不起作用,因为每个表中的列数都不相同。我使用的是 Access 数据库,因此不支持 FULL OUTER JOINS。我在 C#、Visual Studio 的应用程序中使用此查询,由于某种原因,如果没有它给我一个语法错误,我也无法进行内部连接。理想情况下,我希望在一个查询中完成此操作。

例如,假设我有表格:

表 1

userID  name  age
1       Bob   24
2       John  19

表2

userID  col1  col2  col3
1       fd    sd    gh
...

Table3

userID  col4  col5  col6  col7
1       ff    hg    fd    et
...

我想要结果:

userID name age col1 col2 col3 col4 col5 col6 col7 1 Bob 24 fd sd gh ff hg fd et

也许是我最接近的:

SELECT * FROM table1 AS b
INNER JOIN table2 AS c ON c.userID = b.userID
INNER JOIN table3 AS m ON m.userID = b.userID 
WHERE userID = 1;

我得到的错误:

“System.Data.OleDb.OleDbException”类型的未处理异常 发生在 System.Data.dll

附加信息:查询中的语法错误(缺少运算符) 表达式'c.userID = b.userID INNER JOIN table3 AS m ON m.userID = b.UserI'。

我应该补充一点,我希望查询具有适应性(假设我不知道列,但我知道它有用户 ID)

【问题讨论】:

  • 能否请您发布您写的查询,以及您遇到的错误?
  • 使用Inner join
  • 我正在尝试,请参阅上面的尝试
  • 这是您真正的查询还是简化查询?如果您正在简化,您能否发布您的真实查询?我怀疑你只是一个简单的语法错误
  • 表/列名中的任何一个是否为 2 个单词,例如用户身份?如果是这种情况,您需要在单词周围加上方括号 [ ]。例如[用户 ID]

标签: c# sql .net ms-access


【解决方案1】:

左连接应该在 ms-access 中工作:

select *
from Table1 t1
left join Table2 t2
    on t1.userID = t2.userID
left join Table3 t3
    on t1.userID = t3.userID 

【讨论】:

    【解决方案2】:

    这应该在 Acces 中工作:

    Select T1.userID, T1.name,  T1.age, T2.col1,  T2.col2,  T2.col3, T3.col4,  T3.col5, T3.col6,  T3.col7 from Table1 T1
    left join Table2 T2 on T2.userID=T1.userID
    left join Table3 T3 on T3.userID=T1.userID
    

    或者,如果您只希望第一个表中存在记录,请使用内连接:

     Select T1.userID, T1.name,  T1.age, T2.col1,  T2.col2,  T2.col3, T3.col4,  T3.col5, T3.col6,  T3.col7 from Table1 T1
        inner join Table2 T2 on T2.userID=T1.userID
        inner join Table3 T3 on T3.userID=T1.userID
    

    【讨论】:

      【解决方案3】:

      所以最后我很接近了。

      在 MS-Access 中,当连接超过 2 个表时,您必须使用括号(围绕第一个连接?)。其次,在我的 where 条件下,我没有为 userID 指定一个表。请参阅下面的修改后的查询:

      SELECT * FROM table1 AS b
      (INNER JOIN table2 AS c ON c.userID = b.userID)
      INNER JOIN table3 AS m ON m.userID = b.userID 
      WHERE b.userID = 1;
      

      【讨论】:

        【解决方案4】:
        Select
        t1.userID 
        ,t1.name
        ,tb1.age
        ,tb2.col1
        ,tb2.col2
        ,tb2.col3
        ,tb3.col4
        ,tb3.col5
        ,tb3.col6
        ,tb3.col7
        FROM table1 tb1
        INNER JOIN table2 tb2 ON tb1.userID=tb2.userID
        INNER JOIN table3 tb3 ON tb1.userID=tb3.userID
        WHERE --some conditions if u desire.
        

        【讨论】:

        • 我真的在处理更多的表格,这些表格将来会有一些细微的变化。因此,不幸的是,硬编码的解决方案不会起作用,因为我希望它具有适应性
        • 如果您不想选择特定的列表,只需进行全选,然后,如果您希望信息来自您声明的第一个表,请进行内连接,否则为左连接,以防万一想要您加入的表中的信息。因此,我将在向您显示的查询中替换: SELECT * from table1;并将内连接替换为左连接
        • 您的建议返回了与上述相同的错误,但谢谢
        【解决方案5】:

        我认为你的问题在哪里条件。你没有指定表格。

        所以改变。

        Where userId=1 
        

        成为

        Where b.userId=1
        

        【讨论】:

          猜你喜欢
          • 2014-09-15
          • 1970-01-01
          • 2021-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-16
          • 1970-01-01
          • 2015-04-24
          相关资源
          最近更新 更多