本身使用结果的SQL查询

时间:2018-10-29 08:34:34

标签: sql sql-server dynamic

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

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

表1(对于用户1)

C1:    asdfg
C2:    qwert

表3(对于用户2)

D1:    poiu
D2:    trew

表4(对于用户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

1 个答案:

答案 0 :(得分:0)

这个评论太长了。

您的数据结构有问题。您可以通过创建所有表的视图来解决此问题:

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