2014-11-29 2 views
0

Я использую этот запрос для подсчета строк в результате 2 таблиц с использованием объединения и псевдонима в конце запроса, но это не работает:Дубликат ошибки имени столбца во время объединения

SELECT COUNT(*) FROM (
(SELECT * FROM bills INNER JOIN cats INNER JOIN suppliers 
INNER JOIN new_cards 
WHERE new_cards.`Card_Code` LIKE '%8%' 
AND bills.`Sup_ID` = suppliers.`Sup_ID` 
AND new_cards.`Sup_ID` = suppliers.`Sup_ID` 
AND cats.`Cat_ID` = bills.`Cat_ID` 
AND bills.`Cat_ID` = cats.`Cat_ID` 
AND new_cards.`Bill_ID` = bills.`Bill_ID`) 
UNION 
(SELECT * FROM bills INNER JOIN cats INNER JOIN suppliers 
INNER JOIN sold_cards WHERE 
sold_cards.`Card_Code` LIKE '%8%' 
AND bills.`Sup_ID` = suppliers.`Sup_ID` 
AND sold_cards.`Sup_ID` = suppliers.`Sup_ID` 
AND cats.`Cat_ID` = bills.`Cat_ID` 
AND bills.`Cat_ID` = cats.`Cat_ID` 
AND sold_cards.`Bill_ID` = bills.`Bill_ID`) 
) w 

ошибка

Error Code: 1060 
Duplicate column name 'Cat_ID' 
+0

так называете это чем-то еще? – Strawberry

ответ

1

Это не переменные, это нормально для объединения или объединения таблиц с дублируемыми именами столбцов. Смотри ниже.

Является ли ошибка, исходящая от союза или объединения? Попробуйте запустить только первый подвыбор, а затем только второй подвыбор.

В качестве возможного решения проблемы, это выглядит, как вы могли бы вынесем объединение двух карт таблиц и SELECT FROM bills JOIN cats JOIN suppliers JOIN (SELECT * from new_cards UNION SELECT * from sold_cards) cards WHERE ...

UNION объединяет повторяющиеся строки (UNION ALL возвращает все строки с обеих сторон). Если вы знаете, что у вас не будет дубликатов, вы можете полностью отказаться от объединения и выбрать только сумму двух счетчиков напрямую, то есть select (select count(*) from ...joins...) + (select count(*) from ...joins...).

Ничего из этого не ответит, почему оно вернет ошибку.

Я побежал быстрый тест, который работал:

create table a (id int, a int, b int); 
create table b (id int, a int, b int); 
insert into a values (1,1,1), (2,2,2); 
insert into b values (3,3,3); 

select count(*) from ((select * from a) union (select * from b)) t; 
+----------+ 
| count(*) | 
+----------+ 
|  3 | 
+----------+ 
1 row in set (0.00 sec) 

select * from ((select * from a) union (select * from b)) t; 
+------+------+------+ 
| id | a | b | 
+------+------+------+ 
| 1 | 1 | 1 | 
| 2 | 2 | 2 | 
| 3 | 3 | 3 | 
+------+------+------+ 
3 rows in set (0.00 sec) 

select count(*) from a inner join b where a.a = b.a and b.a = a.a; 
+----------+ 
| count(*) | 
+----------+ 
|  0 | 
+----------+ 
1 row in set (0.00 sec) 
+0

Спасибо большое за объяснение –

2

Кажется, у вас есть столбец Cat_ID в обеих котах и ​​таблицах счетов. Когда вы делаете select * при соединении в таблицах, вы получите дубликаты имен столбцов.

Некоторые возможные решения:

  • Переименовать столбец cat_id в одной из таблиц
  • Явное имя колонки в ваше отборного, т.е. вместо «*» использовать «bills.Cat_ID AS NEW_NAME, .. .. "
+0

Спасибо за помощь –

1

О, я вижу это - ошибка исходит из вложенных таблиц выберите временные.

При выполнении запроса mysql должен создать временную таблицу для каждого из двух внутренних выборок. Это те временные таблицы, которые выходят из строя, потому что вы не можете создать таблицу с двумя столбцами с одинаковым именем.

Если вы приравняли два Cat_ID в условии соединения, а не в WHERE, mysql должен признать, что они идентичны, и он должен работать; что-то вроде:

SELECT COUNT(*) FROM (
    SELECT * FROM bills 
    JOIN cats USING (Cat_ID) 
    JOIN suppliers USING (Sup_ID) 
    JOIN sold_cards USING (Bill_ID, Sup_ID) 
    UNION 
    SELECT * ... 
) 

Или, как сказал Svea, выберите определенный столбец как cats.Cat_ID сосчитать. (И выбор только одного столбца будет работать быстрее, чем выбор всех)

select * from (select * from a join b) t; 
ERROR 1060 (42S21): Duplicate column name 'id' 

select * from (select * from a join b using (id, a, b)) t; 
Empty set (0.00 sec) 
Смежные вопросы