【问题标题】:SQL query that uses result in itself本身使用结果的 SQL 查询
【发布时间】:2018-10-29 08:34:34
【问题描述】:

我正在运行一个简单的查询,例如

DECLARE @find varchar(60) = 'findme';

SELECT *
FROM Queue
WHERE 
    column1 LIKE '%' + @find + '%' OR
    column2 LIKE '%' + @find + '%' OR
    column3 LIKE '%' + @find + '%' OR
    ....

这只是告诉我“findme”字符串在任何列中的每个条目。 现在的问题是,在 'ColumnExtra' 中将始终是一个包含另一个表的名称的字符串(可以在此处找到额外的信息),并且“ColumnName”包含当前用户的 ID。

我还需要在“ColumnName”表(对于给定的“ColumnName”用户)中搜索“findme”,并且对于每次命中,无论是仅在原始表中还是在“ColumnName”表中或两者中,我需要两个可能的表格中的所有信息。

例如:

原表

User             1         2         3
-----------------------------------------
Column1:      string1   string1   string3
Column2:      string1   string2   string3
Column3:      findme    string2   string3
ColumnExtra:  table1    table3    table4
ColumnName:   uid1      uid2      uid3

Table1(用户 1)

C1:    asdfg
C2:    qwert

Table3(用户 2)

D1:    poiu
D2:    trew

Table4(用户 3)

E1:    aaaaaa
E2:    findme

SQL 查询应返回以下结果:

User             1         3 
--------------------------------
Coulmn1:      string1   string3
Coulmn2:      string1   string3
Coulmn3:      findme    string3
CoulmnExtra:  table1    table4
CoulmnName:   uid1      uid3
C1:           asdfg
C2:           qwert
E1:                     aaaaa`enter code here`a
E2:                     findme

如果不可能这样,那么下一个最佳解决方案将是

User             1         3 
Column1:      string1   string3
Column2:      string1   string3
Column3:      findme    string3
ColumnExtra:  table1    table4
ColumnName:   uid1      uid3
C1:           asdfg     whateverishere
C2:           qwert     whateverishere
E1:           whatev    aaaaaa
E2:           whatev    findme

【问题讨论】:

  • 如果可能的话,我会建议你完全重新设计这个表结构。这是一个非常糟糕的设计,如果你继续这样做,这些只是你将遇到的问题的唯一开始。
  • 谢谢,但这不是一个选项,而且这个 kinf od 查询不会每天使用。它会帮助我跟踪很多东西
  • 如果不能重新设计表结构,可以使用动态查询
  • 您有可以阅读的示例或页面吗?我不是每天都使用 SQL。
  • 听起来您的数据建模在某个地方出现了严重错误,数据/元数据有很多不适当的混合。相同“类型”的所有数据,如您想与所有此类数据值进行比较,应该在 single 列中。

标签: sql sql-server dynamic


【解决方案1】:

评论太长了。

您的数据结构有问题。您可以通过创建可能被引用的所有表的视图来解决这个问题:

create view all_referenced_tables as
    select 'table1' as table_name, c1 as col1, c2 as col2 from table1 union all
    select 'table2', d1, d2 from table2 union all
    select 'table3', e1, e2 from table3;

然后,您可以在查询中使用它:

SELECT q.*
FROM Queue q LEFT JOIN
     all_referenced_tables art
     ON q.column_extra = art.table_name
WHERE q.column1 LIKE '%' + @find + '%' OR
      q.column2 LIKE '%' + @find + '%' OR
      q.column3 LIKE '%' + @find + '%' OR
      art.column1 LIKE '%' + @find + '%' OR
      art.column2 LIKE '%' + @find + '%'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-24
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多