SQL-запрос, который использует результат сам по себе - PullRequest
0 голосов
/ 29 октября 2018

Я выполняю простой запрос типа

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

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

Это просто говорит мне каждую запись, где строка 'findme' находится в любом столбце. Теперь проблема в том, что в ColumnExtra всегда будет строка, содержащая имя другой таблицы (например, дополнительную информацию можно найти здесь), а «ColumnName» содержит идентификатор текущего пользователя.

Мне нужно искать в таблице «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

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

1 Ответ

0 голосов
/ 29 октября 2018

Это слишком долго для комментария.

У вас проблема с вашей структурой данных. Вы можете обойти это, создав представление всех таблиц, на которые можно сослаться:

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 + '%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...