【问题标题】:SQL Joins stop working when table columns are defined定义表列时 SQL 连接停止工作
【发布时间】:2016-12-09 01:13:06
【问题描述】:

我正在使用 sql 在 Excel 中创建自定义 ODBC 查询。

我有 2 个表 'TBL_CONTACT' 和 'TBL_ADDRESS' 我想在 'contactid' 上进行 INNER JOIN,这是两个都存在的列。

如果我选择所有列,这工作正常,但如果我开始定义我想要显示的列,则停止工作。

工作代码:

SELECT * FROM "TBL_CONTACT" AS CONTACT

INNER JOIN (SELECT * FROM "TBL_ADDRESS" AS ADDRESS) ADDRESS
ON CONTACT.contactid = ADDRESS.contactid

非工作代码:

SELECT CONTACT.contactid, CONTACT.fullname FROM "TBL_CONTACT" AS CONTACT

INNER JOIN (SELECT * FROM "TBL_ADDRESS" AS ADDRESS) ADDRESS
ON CONTACT.contactid = ADDRESS.contactid

这仅显示“TBL_CONTACT”中的“contactid”和“fullname”列,不加入“TBL_ADDRESS”中的任何内容。

示例:

TBL_CONTACT
contactid   firstname   fullname
1001        John        John Smith
1002        Tom         Tom Adams

TBL_ADDRESS
contactid   line1       line2        postcode
1001        3 Farm Ln   Essex        AB1 1BA
1002        1 Tim st    Kent         CN2 2NC

想要的结果:

contactid   fullname     contactid2  line1       line2    postcode
1001        John Smith   1001        3 Farm Ln   Essex    AB1 1BA
1002        Tom Adams    1002        1 Tim st    Kent     CN2 2NC

第一个代码给出以下结果:

contactid   firstname    fullname     contactid2  line1       line2    postcode
1001        John         John Smith   1001        3 Farm Ln   Essex    AB1 1BA
1002        Tom          Tom Adams    1002        1 Tim st    Kent     CN2 2NC

第二个代码给出以下结果:

contactid   fullname
1001        John Smith
1002        Tom Adams

我对 SQL 还很陌生,但不确定我在这里做错了什么。任何帮助将不胜感激!

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。您的描述不能很好地传达问题,尤其是因为这两个查询都有效。
  • 并在SELECT语句中的字段名前写表名:SELECT TBL_CONTACT.contactid, TBL_CONTACT.fullname, TBL_ADDRESS.contactid, TBL_ADDRESS.fullname
  • 在列中指定别名
  • 第一个查询根本不应该运行,"DATABASE" 是什么?当然,当您不在 SELECT 中列出它们时,您不会从第二个表中获取列
  • 当您有两个(或更多)列同名时,您必须对它们进行限定,例如TBL_CONTACT.contactid.

标签: sql sql-server database odbc inner-join


【解决方案1】:

加入表会导致列可供您选择。当您选择所有列时(在您的第一个代码 sn-p 中使用 *),您的连接表的列也将被选择。但是,当手动选择列时,您还必须从连接表中定义您想要的列。

假设您想拥有表 TBL_CONTACT 中的 2 列 contactidfullname 以及连接表 TBL_ADDRESS 中的所有列:

SELECT `TBL_CONTACT`.`contactid`, `TBL_CONTACT`.`fullname`, `TBL_ADDRESS`.* FROM TBL_CONTACT 
INNER JOIN TBL_ADDRESS
ON `TBL_CONTACT`.`contactid` = `TBL_ADDRESS`.`contactid` 

反引号是可选的。

或者,您也可以为连接表指定列。

【讨论】:

  • 非常感谢!我不明白连接表必须包含在原始选择语句中。
【解决方案2】:

试试这个

//MySQL
SELECT TC.contactid,TC.fullname,TA.`address_table_column` 
FROM TBL_CONTACT TC
INNER JOIN TBL_ADDRESS TA
ON TC.contactid = TA.contactid

//SQL Server
SELECT TC.contactid,TC.fullname,TA.[address_table_column] 
FROM TBL_CONTACT TC
INNER JOIN TBL_ADDRESS TA
ON TC.contactid = TA.contactid

【讨论】:

  • 地址? @Thomas 根本没有提到这个领域
  • 用于分隔标识符的方括号是特定于 MS SQL Server 的。 MySQL 有反引号。 (而且 ANSI SQL 有双引号,例如 "address"。)
【解决方案3】:

如果您已加入多个表,并且您选择了一些必须指定的字段 该字段属于哪个表。

因为就像你的情况一样,同一个字段可以在两个表中,然后 mysql 不知道要获取哪一个。

因此,只需在查询中使用表前缀,当然还有 SELECT 您想要的所有字段:

    SELECT `TBL_CONTACT`.`contactid`,`TBL_CONTACT`.`fullname`,`TBL_ADDRESS`.`contactid` as contactid2,`TBL_ADDRESS`.`line1`,`TBL_ADDRESS`.`line2`,`TBL_ADDRESS`.`postcode`  FROM `TBL_CONTACT`        
    INNER JOIN `TBL_ADDRESS`
    ON `TBL_CONTACT`.`contactid` = `TBL_ADDRESS`.`contactid`

【讨论】:

  • 谢谢,但这仍然没有给我加入的列 - 如果这有帮助,我已经在我的原始问题中添加了更多细节。
  • "这仅显示来自 'TBL_CONTACT' 的 'contactid' 和 'fullname' 列,不加入来自 'TBL_ADDRESS' 的任何内容。" .....实际上它确实加入了,但当然它显示了你选择的内容......只是SELECT你想要的所有字段。我更新了我的答案......
  • 谢谢,这对我来说很有意义。
【解决方案4】:
SELECT contact.*, ADDRESS.* FROM "TBL_CONTACT" contact INNER JOIN "TBL_ADDRESS"  ADDRESS  ON contact.contactid = ADDRESS.contactid;

【讨论】:

  • 虽然这可能会解决 OP 的问题,但最好提供一些关于您实际修复的内容的上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2016-12-24
相关资源
最近更新 更多