从所有表中选择 - MySQL

29

我有一个名为 listDB 的MySQL数据库,其中包含几个带有列名称 Product 等的表。我想从所有表中选择 Product Like %XYZ% 并在单独的表格中显示搜索结果。

我尝试了以下方法:

SELECT * FROM * WHERE Product LIKE %XYZ%

但是它没有起作用。这个目的的正确查询是什么?


2
使用 union .. UNION 用于将多个 SELECT 语句的结果合并为一个结果集。 - Suhel Meman
1
请尝试这段代码:SELECT * FROM listDB .* WHERE Product LIKE '%XYZ%'; - Parvathy
@Parvathy - 这个查询不起作用了.. 语法错误发生了。 - Farid-ur-Rahman
如果你不得不这样做,那么你应该认真重新考虑一下你的数据库架构。 - Colonel Thirty Two
6个回答

13

使用此语句,您可以获取包含产品列的所有表格:

```sql SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'product'; ```
SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('Product')
        AND TABLE_SCHEMA='YourDatabase';

然后你需要在这些表上运行一个游标,以便每次选择:

Select * from OneTable where product like '%XYZ%'

结果应该被输入到第三个表或视图中,请查看此处

注意:这仅适用于所有表的结构类似的情况,否则您将不得不查看哪些列对于所有这些表是相同的,并创建您的结果表/视图只包含这些列。


在sqlplus中,它是: SELECT DISTINCT TABLE_NAME FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME IN ('Product') - Dr.Seltsam

8
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%' 

... and so on


3
为什么不直接转储mysql数据库,但没有使用--single-transaction参数运行时会中断其他客户端的连接。
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 

之后读取文件并在字符串中搜索所需内容...


3

对@inno的回答进行改进

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();

2
正如Suhel Meman在评论中所说:
SELECT column1, column2, column3 FROM table 1
UNION
SELECT column1, column2, column3 FROM table 2
...

会起作用。

但是你的所有 SELECTS 必须由相同数量的列组成。因为你将其显示在一个结果表中,它们应该包含相同的信息。

你可能想要做的是,根据产品 ID 或类似方式进行连接。这样,你会得到更多的列,大多数情况下更有意义。


2
您可以从 information_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();

这不会起作用。SELECT * FROM a 将尝试从一个名为 a 的表中进行选择,而不会将其视为变量。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接