Избегать неоднозначных условий в MySQL

#mysql

#mysql

Вопрос:

Я работаю в очень ограниченной среде MySQL (все вызовы MySQL передаются как параметры массива). Проблема в том, что я не знаю, как разрешить неоднозначное условие.

В этой среде все вызовы MySQL принимают такую форму:

 SELECT value1,value2,...,valueN 
FROM table1,table2,...,tableN 
WHERE cond1 OP cond2 OP ... OP condN 
  

Это не проблема, пока у вас не будут одинаковые имена столбцов в table1 и table2. Представьте, что в таблице 1 есть столбцы {a, b, z}, а в таблице 2 есть имена столбцов {c, d, f, z}. Я могу сделать это:

 SELECT * 
FROM table1, table2 
WHERE a='3' AND table1.z='5'
  

Идеально, но одно из ограничений заключается в том, что я не могу использовать формат table1.z, просто z =’5′, что приводит к коллизии.

Итак, вопрос в следующем: есть ли какой-либо способ предотвратить эту двусмысленность без использования префикса имени таблицы в части условия? (например, было бы здорово, если бы был способ использовать только часть таблицы2 или сказать, что таблица1 имеет приоритет в случае двусмысленности).

Комментарии:

1. Почему вы не можете использовать имена таблиц или псевдонимы таблиц? Необходимость игнорировать совершенно простое решение этой проблемы является странным ограничением…

2. Большинство библиотек MySQL включают способ указания имени таблицы / схемы для столбца. Какой язык и фреймворк вы используете для своих вызовов MySQL?

3. Потому что таковы требования 🙂 Он используется в визуальном редакторе, который позволяет пользователям «играть» с некоторыми простыми предложениями mysql.

4. Нет, это просто ограниченная среда 🙂

Ответ №1:

Невозможно избежать столкновения, если вы не можете определить, из какой таблицы происходит «MyColumn».

Ваши ограничения кажутся немного глупыми… Вы в основном запрашиваете действительный результат, когда утверждаете, что не можете написать действительный SQL….

Возможно, вместо SELECT ввода из table1 вы бы SELECT использовали вложенный подзапрос, в котором вы присвоили псевдонимы именам столбцов…

Например:

если в table1 и table2 есть столбец «MyColumn»
, а не:

  SELECT 
    * 
 FROM 
    table1,table2 
 WHERE myColumn = @value -- produces collision!
  

Не могли бы вы сказать:

 SELECT 
    * 
FROM 
    (SELECT myColumn AS foo FROM table1) newTable1, 
    (SELECT myColumn AS bar FROM table2) newTable2
WHERE 
    foo = @value
  

Таким образом, вы не полностью определяете таблицы во внешнем WHERE предложении, но вы переназначаете столбцы внутри подзапросов (таким образом, преобразуя их в разные имена для внешнего запроса)

Это похоже на обходное упражнение, хотя

РЕДАКТИРОВАТЬ:
http://thedailywtf.com/Articles/SQL-Sentences.aspx

«Предложения MySQL?»