【问题标题】:Search for a String and a Number at all tables in a Database在数据库中的所有表中搜索字符串和数字
【发布时间】:2018-10-25 07:37:33
【问题描述】:

我试图在几个地方搜索几天,但没有成功使用此脚本。 我需要在数据库中的所有表中的同一记录中搜索String(NVarChar)Number(Int)。 在以下示例中,我需要找到同时存在这两个条件的表和字段。 例如,查找 AAA 字符串,但前提是存在编号为 990 的字段。

TBL_TEST

FIELD_A    |    FIELD_B    |    FIELD_C   |
AAA        |     124       |      12      |
BBB        |     457       |      12      |
CCC        |     347       |      12      |
AAA        |     990       |      13      | <---
BBB        |     387       |      13      |
CCC        |     213       |      13      |
AAA        |     888       |      14      |
BBB        |     888       |      14      |
CCC        |     888       |      14      |

****** 我在这个好地方找到了这个脚本,但它只搜索字符串数据并且只出现一次,但我需要找到一个字符串和一个数字,并且只找到两个记录都可用的记录。

StackOverFlow

让我试着更好地解释一下,希望我的英语对我有所帮助。 想象一个有 3 个表(TBL1、TBL2 和 TBL3)的数据库。 这些表有几列,但在本例中,每个表我只放置 3 列。

TBL1

FIELD_A    |    FIELD_B    |    FIELD_C   |
AAA        |     124       |      132     |
BBB        |     457       |      1E2     |
CCC        |     347       |      1E2     |
AAA        |     KK0       |      13W     | 
BBB        |     387       |      136     |
CCC        |     213       |      133     |
AAA        |     888       |      990     |<---
BBB        |     888       |      144     |
CCC        |     888       |      14      |

TBL2

FIELD_A    |    FIELD_B    |    FIELD_C   |
AAA        |     ASD       |      12      |
BBB        |     3ED       |      12      |
CCC        |     32E       |      12      |
AAA        |     990       |      13      |<---
BBB        |     123       |      13      |
CCC        |     213       |      13      |
AAA        |     445       |      14      |
BBB        |     234       |      14      |
CCC        |     A23       |      14      |

TBL3

FIELD_A    |    FIELD_B    |    FIELD_C   |
AAA        |     124       |      132     |
BBB        |     457       |      990     |
CCC        |     347       |      1E2     |
AAA        |     KK0       |      13W     | 
BBB        |     387       |      136     |
CCC        |     213       |      133     |
AAA        |     888       |      990     |
BBB        |     888       |      144     |
990        |     888       |      AAA     |<---

脚本的结果一定是这样的。

TBL1
FIELD_A / FIELD_C
TBL2
FIELD_A / FIELD_B
TBL3
FIELD_A / FIELD_C

希望足够清楚。 再次感谢您。

【问题讨论】:

  • 有了那个样本表数据,预期的结果是什么? 990 是在 FIELD_B 列还是 FIELD_C 列有关系吗?
  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您使用的数据库产品添加tag postgresql, oracle, sql-server, db2, ...
  • 嗨,Jarlh,预期的结果是第四行的结果,您可以在其中看到末尾的箭头。它是在 A、B、C 列还是 N 列中都没有关系。我希望它指出我在哪个表和列中找到了结果。
  • 嗨,'a_horse_with_no_name',我正在使用 SQL Server。

标签: sql sql-server search


【解决方案1】:

使用相关子查询

select * from  your_table t 
                where exists ( select 1 from your_table t1
                                             where t1.FIELD_A=t.FIELD_A and
                                                         t1.FIELD_B=990
                             )

【讨论】:

    【解决方案2】:

    使用 AND 运算符对两个条件使用 where 子句

    select * from tablename where FIELD_A='AAA' and FIELD_B=990
    

    【讨论】:

    • 你的意思可能是 FIELD_B=990
    • 嗨,我正在寻找的脚本是在数据库中的所有表中搜索的脚本。
    【解决方案3】:

    您需要在所有表中动态搜索两个值,以这个简单的例子(尝试粘贴并执行):

    DECLARE @SQL AS nvarchar(MAX)
        SET @SQL = ''
        Select  @SQL = @SQL + 'Select * from TBL_TEST where '+ISC.COLUMN_NAME+'= ''AAA'' AND '+(Select top(1) C.COLUMN_NAME FROM 
            INFORMATION_SCHEMA.TABLES T
            INNER JOIN INFORMATION_SCHEMA.COLUMNS C ON T.TABLE_NAME = C.TABLE_NAME
        where IST.TABLE_NAME = 'TBL_TEST' and C.TABLE_NAME ='TBL_TEST'  and c.COLUMN_NAME<>ISC.COLUMN_NAME)+'= ''990'''
        FROM 
            INFORMATION_SCHEMA.TABLES IST
            INNER JOIN INFORMATION_SCHEMA.COLUMNS ISC ON IST.TABLE_NAME = ISC.TABLE_NAME
        where IST.TABLE_NAME = 'TBL_TEST'
    
        exec(@SQL)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      相关资源
      最近更新 更多