Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从所有表中选择-MySQL_Mysql_Sql - Fatal编程技术网

从所有表中选择-MySQL

从所有表中选择-MySQL,mysql,sql,Mysql,Sql,我有一个名为listDB的mySQL数据库,其中包含多个列名称为Product等的表。我想从所有包含Product(如%XYZ%)的表中选择,并在单独的表中显示搜索结果 我试过这个: SELECT * FROM * WHERE Product LIKE %XYZ% 但它不起作用。对此,什么是正确的查询?正如Suhel Meman在评论中所说: SELECT column1, column2, column3 FROM table 1 UNION SELECT column1, column2,

我有一个名为
listDB
的mySQL数据库,其中包含多个列名称为
Product
等的表。我想
从所有包含Product(如%XYZ%)的表中选择
,并在单独的表中显示搜索结果

我试过这个:

SELECT * FROM * WHERE Product LIKE %XYZ%

但它不起作用。对此,什么是正确的查询?

正如Suhel Meman在评论中所说:

SELECT column1, column2, column3 FROM table 1
UNION
SELECT column1, column2, column3 FROM table 2
...
会有用的

但是所有的
选择都必须包含相同数量的列。由于您在一个结果表中显示它,所以它们应该包含相同的信息


您可能想做的是在产品ID上进行连接或类似的操作。通过这种方式,您将获得更多的列,这在大多数情况下更有意义。

您可以使用以下语句获得包含列产品的所有表:

SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('Product')
        AND TABLE_SCHEMA='YourDatabase';
然后,您必须在这些表上运行,以便选择每个时间:

Select * from OneTable where product like '%XYZ%'
结果应该输入到第三个表或视图中,请查看


注意:只有当所有表的结构相似时,这才有效,否则aou将必须查看所有这些表的哪些列是统一的,并创建结果表/视图以仅包含这些列。

您可以从信息\u Schema.columns获取所有包含列“Product”的表

SELECT DISTINCT table_name FROM information_schema.columns WHERE column_name ="Product";
也不创建一个过程

delimiter //
CREATE PROCEDURE curdemo()
BEGIN
  DECLARE a varchar(100); 
  DECLARE cur1 CURSOR FOR SELECT DISTINCT table_name FROM information_schema.columns WHERE column_name ="Product";
  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO a;

    SELECT * FROM a;

  END LOOP;

  CLOSE cur1;
END;

delimiter ;

call curdemo();

为什么您不只是转储mysql数据库,而是在运行时使用扩展--单个事务将中断与其他客户端的连接:

mysqldump --host=hostname.de --port=0000 --user=username --password=password --single-transaction --skip-add-locks --skip-lock-tables --default-character-set=utf8 datenbankname > mysqlDBBackup.sql 
在那之后,读出文件并搜索你想要的。。。。串串

SELECT product FROM Your_table_name WHERE Product LIKE '%XYZ%';
上面的语句将显示单个表的结果。如果要添加更多表,只需使用UNION语句即可

SELECT product FROM Table_name_1 
WHERE Product LIKE '%XYZ%'  
UNION  
SELECT product FROM Table_name_2 
WHERE Product LIKE '%XYZ%'  
UNION  
SELECT product FROM Table_name_3 
WHERE Product LIKE '%XYZ%' 

。。。等等

改进@inno-answer

delimiter //

DROP PROCEDURE IF EXISTS get_product;  
CREATE PROCEDURE get_product()
BEGIN
   DECLARE i VARCHAR(100); 
   DECLARE cur1 CURSOR FOR SELECT DISTINCT table_name FROM information_schema.columns WHERE COLUMN_NAME IN ('Product');
   OPEN cur1;

   read_loop: LOOP
       FETCH cur1 INTO i;
    
       SELECT i; -- printing table name
    
       SET @s = CONCAT('select * from ', i, ' where Product like %XYZ%'); 
       PREPARE stmt1 FROM @s;
       EXECUTE stmt1;
       DEALLOCATE PREPARE stmt1;

   END LOOP read_loop;

   CLOSE cur1;
END//

delimiter ;

call get_product();

使用
联合
<代码>联合用于将多个SELECT语句的结果合并到单个结果集中尝试从listDB.*中选择*,其中的产品类似于“%XYZ%”@Parvathy-此查询不起作用。。语法错误发生如果必须这样做,你应该重新考虑你的数据库模式。这是行不通的
SELECT*FROM a
将尝试从字面上命名为
a
的表中进行选择,它不会将其视为变量。@barmar在sqlplus中工作了将近8年:从列名称所在的所有列中选择不同的表名('Product')