Mysql 不使用列名的两个表的差异

Mysql 不使用列名的两个表的差异,mysql,Mysql,我必须返回在比较两个表时不同的所有行/行计数 我发现除了sql之外。mysql中除了mysql之外还有其他类似的东西吗 我知道可以使用在列表中包含列名的查询来完成,但我不想使用列名 我的例子 表1 表2 仅使用表名可以实现吗 谢谢是的,您可以通过基于方案构建这两个查询,然后将它们合并在一起来归档。。所有字段上的分组依据和条件计数(*)为1。下面是一个简单的示例(完整sql): 因为您无法使用已知的列名: 有。是的,这可能有效。。但是,如果您有非常大的数据集合,对表中的每个字段进行搜索,并对每个字

我必须返回在比较两个表时不同的所有行/行计数

我发现除了sql之外。mysql中除了mysql之外还有其他类似的东西吗

我知道可以使用在列表中包含列名的查询来完成,但我不想使用列名

我的例子

表1 表2 仅使用表名可以实现吗


谢谢

是的,您可以通过基于方案构建这两个查询,然后将它们合并在一起来归档。。所有字段上的分组依据和条件计数(*)为1。下面是一个简单的示例(完整sql):


因为您无法使用已知的列名:


有。

是的,这可能有效。。但是,如果您有非常大的数据集合,对表中的每个字段进行搜索,并对每个字段执行两次,这不是一个坏主意吗?这个问题似乎很好。。而且非常有用。。但是如果你在大表上使用它,恐怕会对性能造成很大的影响。它看起来像是“不”,“在同一个查询中不能多次引用临时表”:那么有什么方法可以做到这一点,因为基本上我必须在两个结果集上进行比较,与多次编写查询不同,有一种方法可以直接完成此操作:无法重新打开表:“table2”。错误是因为MySQL中存在奇怪的临时表限制(在前面的评论中提到)。您可以使用以下解决方法之一:1)使用
视图
而不是临时表;或2)创建临时表的第二个副本,并在第二个
选择中引用它们。否这对临时表不起作用,因为它不会添加到方案信息表中。但是,通过找到另一种方法来获取临时表的字段名并稍微重建querya和queryb,应该可以修复这个问题。也许您可以改用showcolumns:
|column1|column2|column3|column4|column5|column6|
+-------+-------+-------+-------+-------+-------+    
|Value 1|Value 2|Value 3|Value 4|Value 5|Value 6|     
|Value 1|Value 2|Value 3|Value 4|Value 5|Value 6|     
|Value 1|Value 2|Value 3|Value 4|Value 5|Value 6|     
|Value 1|Value 2|Value 3|Value 4|Value 5|Value 6|     
|Value 1|Value 2|Value 3|Value 4|Value 5|Value 6|     
|column1|column2|column3|column4|column5|column6|
+-------+-------+-------+-------+-------+-------+     
|Value 1|Value 2|Value 3|Value 4|Value 5|Value 6|     
|Value 1|Value 2|Value 3|Value 4|Value 5|Value 6|     
|Value 1|Value 2|Value 3|Value 4|Value 5|Value 6|     
|Value 1|Value 2|Value 3|Value 4|Value 5|Value 6|     
|Value 1|Value 2|Value 3|Value 4|Value 5|Value 6|     
set @tablea='tablea';
set @tableb='tableb';

SELECT
   CONCAT(
   "SELECT ",
    GROUP_CONCAT(CONCAT('`', column_name, '` as f',ordinal_position) ORDER BY column_name),
    " FROM `",
    @tablea,
    "`"
    )
FROM   `information_schema`.`columns` 
WHERE  `table_schema`=DATABASE() 
       AND `table_name`=@tablea
INTO @querya;


SELECT
   CONCAT(
   "SELECT ",
    GROUP_CONCAT(CONCAT('`', column_name, '` as f',ordinal_position) ORDER BY column_name),
    " FROM `",
    @tableb,
    "`"
    )
FROM   `information_schema`.`columns` 
WHERE  `table_schema`=DATABASE() 
       AND `table_name`=@tableb
INTO @queryb;



SELECT
    GROUP_CONCAT(CONCAT('`tbl`.`f',ordinal_position,'`') ORDER BY column_name)
FROM   `information_schema`.`columns` 
WHERE  `table_schema`=DATABASE() 
       AND `table_name`=@tablea
INTO @groupbypart;


select concat('select * from ((',@querya,')UNION ALL(',@queryb,')) as tbl group by ',@groupbypart,' having count(*) =1')
into @finalquery;       


PREPARE execquery FROM @finalquery;
EXECUTE execquery;
SELECT t1.*
  FROM table1 t1
  NATURAL LEFT JOIN (SELECT t2.*, 1 AS some_magic_name FROM table2 t2) t2
  WHERE t2.some_magic_name IS NULL
UNION
SELECT t2.*
  FROM table2 t2
  NATURAL LEFT JOIN (SELECT t1.*, 1 AS some_magic_name FROM table1 t1) t1
  WHERE t1.some_magic_name IS NULL