【问题标题】:How to merge two tables in sql using inner join but without a common value in both tables如何使用内部联接在 sql 中合并两个表,但两个表中没有共同值
【发布时间】:2015-11-06 03:42:24
【问题描述】:

我的数据库中有两个表,我想使用内部连接合并这两个表 - 两个表中都有一个唯一的名称相同但数据不同,因此我不能使用该列,因为主数据中的数据不同关键栏目! 我也不能使用联合运算符,因为我想要第一个表和第二个表中的大部分列 如何合并这两个表? 这是我正在尝试做的代码 sn-p:

注意:(表一中的farmercode与表二中的farmercode值不同,但列名相同,也是主键)

SELECT  base.stationCode ,
        base.Farmercode ,
        base.Farmername ,
        base.POcode ,
        base.Sex ,
        base.DateofContract ,
        CONCAT(a.InspectionDate1, a.InspectionDate2) AS Internal_inspectionDate ,
        a.UnderstandingOfCertification ,
        a.TotFarmAcreage ,
        a.CoffeePlots ,
        a.CoffeeAcreage ,
        a.ArabicTrees ,
        a.ProductionEstimateFarm ,
        a.Tel ,
        a.InspectorName
FROM    kcl_baseline_2015_final AS base
        INNER JOIN main AS a ON ( base.farmerCode = a.farmerCode ) 

【问题讨论】:

  • 如果两个表之间没有关系,如何正确连接它们(除非您使用交叉连接)?用于连接两个表的不是列名,而是列值(正如您所说的不同)。
  • 好的...我知道交叉连接!
  • 指定如何你想“合并”表格,即应该在哪里返回什么数据。两个表中哪些字段应该相等? - 请注意,您可以将 any 字段连接到 any 其他字段,无论是否是 PK。
  • 来自上面的 select 语句:我只需要从两个表中指定的列中的数据。我本可以使用连接,但我没有输出正确的结果。
  • @King14:如果您使用交叉连接,您将获得这两个表的笛卡尔积(任意到任意)。不是你现在正在寻找的。我建议通过添加适当的 PK 和 FK 来改进您的数据库结构。

标签: sql database join mysql-workbench


【解决方案1】:

根据基本标准,为了合并两个表,它们之间应该存在关系。但是在您的情况下,无法建立关系,因为这两个字段可能具有不同的数据。 因此,您可以在不使用 ON 条件或 UNION ALL 运算符的情况下进行交叉连接。


编辑 1:
如果您想合并到表,即使它们没有相同的编号。的列。然后,您可以使用别名定义伪列,如下所示,

SELECT Column1, '' Column2 FROM Table1
UNION ALL
SELECT Column1, Column2 FROM Table2;

编辑 2:
如果要合并到具有不同列并希望全部显示的表中。然后您可以使用伪列作为,

SELECT Column1, Column2, '' Column3, '' Column4 FROM Table1
UNION ALL
SELECT '' Column1, '' Column2, Column3, Column4 FROM Table2;

【讨论】:

  • union all 运算符将不起作用——它只从第一个 select 查询中选择列名,而忽略第二个 select 中的新列名。请注意我说:列名。否则它会选择所有数据并合并两个表。就我而言,我想要从两个表中指定的所有列
  • 我不关心这个意义上的列数。检查此示例查询; select col1, col2 from tab1 union all select col3, col4 from tab2.当我运行该查询时,我需要在包含所有数据的结果集中查看:col1、col2、col3、col4。
  • 但是 union/union all 操作符只做:col1 col2 然后追加下面的所有数据。注意:我需要看到 4 列而不是 2 列!
  • 是的。上述使用伪列的方法可以用于您提到的内容。检查编辑的帖子。
【解决方案2】:

(我猜 OP 所问的初步答案。一旦问题得到澄清,将进行编辑。)

SELECT
  a.x, a.y, a.z,
  b.o, b.p, b.q
FROM my_first_table a
LEFT OUTER JOIN another_table b ON 1=2 -- don't want any data, just the column definitions!
UNION
SELECT
  NULL, NULL, NULL,
  b.o, b.p, b.q -- only the data from the second table.
FROM another_table b

【讨论】:

  • quick qn:关于primary_key为空...是主键 - 一个唯一的列,来自哪个表,mytable a或mytable b?
  • primary_key 只是我为任何不允许 null 值的列弥补的占位符。
  • 所以我尝试执行这个 sql 查询:select a.FarmerName, a.Farmercode from kcl_baseline_2015_final a left outer join main as b on a.FarmerCode is NULL union select b.UnderstandingOfCertification, b.CoffeePlots from main as b left outer join kcl_baseline_2015_final as a on b.FarmerCode is NULL;
  • 我得到了这样的输出:, 所有数据都显示在底部。
  • 当你使用联合时——它不会从第二个选择操作中创建列名,因为它希望它们是相同的!就我而言,它们不一样!
猜你喜欢
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多