2013-11-08 7 views
1

Я пытаюсь построить внутреннее соединение в подзапросе. Я продолжаю ошибаться, говоря, что он не может снова открыть таблицу «t1».Внутреннее соединение MySQL в подзапросе

Это то, что я пытаюсь сделать в простом английском языке:

select all instances of "SystemHeader_Name" from "temp2" where "SystemHeader_Name" and "System_Value" are shared across "Tool_Name"

Это моя попытка:

SELECT t1.SystemHeader_Name FROM temp2 t1 
INNER JOIN (
    SELECT DISTINCT Tool_Name, SystemHeader_Name, System_Value FROM temp2 
) AS t2 ON (t2.SystemHeader_Name = t1.SystemHeader_Name 
    AND t2.System_Value = t1.System_Value); 

Как это сделать?

Пример
С:

Tool_Name,SystemHeader_Name,System_Value 
t1,h1,v1 
t1,h2,v2 
t2,h1,v1 

Результат должен быть:

h1 

Выпуск
После некоторых более копать, я решил, что моя проблема была с временной таблицей , От this document: You cannot refer to a TEMPORARY table more than once in the same query.

Похоже, мне нужно разработать лучший метод, чем использовать временные таблицы. Спасибо за вашу помощь.

+0

Вы имеете в виду, что имя_иденения одинаково в обеих таблицах? – collusionbdbh

+0

Нет. Я пытаюсь найти пары SystemHeader_Name и System_Value. Я просто добавил пример, чтобы помочь прояснить ситуацию. – TehTechGuy

+0

Простое соединение будет работать, так как оно докажет существование другой строки с тем же именем systemheader и system_value с другим именем инструмента в соответствии с моим кодом ниже. Добавьте DISTINCT, если вы хотите только одно имя systemheader_name. – collusionbdbh

ответ

1

Это следует сделать это:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 

SELECT DISTINCT t1.SystemHeader_Name 
FROM temp2 t1 
JOIN temp2 t2 
    ON t2.SystemHeader_Name = t1.SystemHeader_Name 
    AND t2.System_Value = t1.System_Value 
    AND t2.Tool_Name <> t1.Tool_Name 
+0

У меня все еще есть ошибка: «Невозможно снова открыть таблицу:« t1 »« – TehTechGuy

+0

Возможно, вам нужно убедиться, что ваша временная таблица все еще находится в области видимости. – collusionbdbh

+0

Я просто сделал, temp2 все еще существует. – TehTechGuy

1

Попробуйте это:

SELECT distinct t1.SystemHeader_Name 
FROM temp2 t1 
where exists(
    SELECT 'X' 
    FROM temp2 t2 
    WHERE t2.system_value = t1.system_value 
    AND t2.tool_name <> t1.tool_name 
    AND t2.systemheader_name = t1.systemheader_name 
) 

я использую существует вместо того, чтобы присоединиться к, потому что вы не хотите, чтобы все строки, кроме одного, если существует другой systemheader

Расскажите я, если выполняю свою задачу.

+0

Это также приводит к ошибке: «Не удается открыть таблицу: 't1' " – TehTechGuy

+0

Но таблица temp2 является временной таблицей? Временная таблица доступна только в сеансе, где вы создали. –

+0

Да, temp2 - временная таблица. Все, что я сделал, было в том же сеансе. – TehTechGuy

Смежные вопросы