2009-06-01 3 views
4

У меня есть следующие две таблицы:Неоднозначность `id` поле

system 
- id 
- systemName 
- idOrganization 

organization 
- id 
- officeSymbol 

Я бегу следующий запрос и получение в id неоднозначное ошибка:

SELECT system.systemName, organization.officeSymbol 
FROM system 
LEFT JOIN (organization) 
ON (system.idOrganization = organization.id) 

Как вы можете видеть, я m, не выбирая столбец id. Если я помещаю system.id в список полей для выбора, я больше не получаю эту ошибку. К сожалению, способ обработки этих данных Я не могу вернуть id - мы не хотим, чтобы он отображался пользователю.

Также, если я добавляю GROUP BY system.systemName, я больше не получаю ошибку - но это просто не похоже на оптимальное решение.

Примечание: LEFT JOIN является намеренным, поскольку не все системы будут назначены Организации.

SELECT VERSION() 
--> 5.0.77-community-log 

CREATE TABLE system (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `systemName` VARCHAR(45) DEFAULT NULL, 
    `idOrganization` INT(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_system_organization` (`idOrganization`), 
    CONSTRAINT `fk_system_organization` 
    FOREIGN KEY (`idOrganization`) 
    REFERENCES `organization` (`id`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE organization (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `officeSymbol` VARCHAR(45) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

ответ

5

Проверено на 5.0.77:

 

SELECT VERSION(); 

VERSION() 
5.0.77 


CREATE TABLE organization (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `officeSymbol` VARCHAR(45) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
CREATE TABLE system (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `systemName` VARCHAR(45) DEFAULT NULL, 
    `idOrganization` INT(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_system_organization` (`idOrganization`), 
    CONSTRAINT `fk_system_organization` 
    FOREIGN KEY (`idOrganization`) 
    REFERENCES `organization` (`id`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT 
INTO organization 
VALUES 
     (1, 'Organization 1'), 
     (2, 'Organization 2'); 
INSERT 
INTO  system 
VALUES (1, 'System 1', 1), 
     (2, 'System 2', 2); 
SELECT system.systemName, organization.officeSymbol 
FROM system 
LEFT JOIN 
     (organization) 
ON  (system.idOrganization = organization.id); 

systemName  officeSymbol 
System 1  Organization 1 
System 2  Organization 2 

Все отлично работает.

Обратите внимание, что LEFT JOIN бесполезно здесь, так как у вас есть FOREIGN KEY к organization, и всегда будет organization для каждого данного system.

В вашем комментарии к @Artem Barger к сообщению Вы сказали:

I'm only selecting on 5 of the 42 fields shared between these 2 tables

ли, что существуют и другие поля в таблицах и/или запрос?

Поскольку у вас есть синтаксическая ошибка, каждая запятая может иметь значение.

+1

+1 за то, что он ленив, чем я. –

+0

Отправил скрипты создания в соответствии с запросами, а также информацию о версии. Запрос просто запускается непосредственно в браузере запросов на данный момент, возвращая значение столбца «id» в списке полей неоднозначно, ErrorNo: 1052. –

+0

Другие поля в таблицах. Моя проблема заключается в том, что использование DISTINCT будет возвращать только уникальные строки с учетом этого запроса, но могут быть другие данные, которые приводят эти две записи к визуализации двух строк результата (но я не хочу, чтобы эти данные возвращались конечному пользователю). Ошибки синтаксиса только из-за ввода - этот код находится в независимой сети, но я уверен, что он действительно там. –

1

Я не уверен, что происходит, так как я не достаточно хорошо знаком с MySql, но я всегда предпочитаю называть столбцы как SYSTEMID и OrganizationID и не gernically как «ID».

Присвоение имен столбцов таким образом, приведет к комбинациям PK-FK, которые имеют такое же имя:

bad PK-FK names  good PK-FK names 
system    system 
    id     SystemID 
    systemName   systemName 
    idOrganization  OrganizationID <-- 

organization   organization 
    id     OrganizationID <-- 
    officeSymbol   officeSymbol 
+1

Не могу не согласиться больше. Organization.OrganizationID является избыточным и не означает никакой разницы между вашим основным ключом и вашими внешними ключами. –

+1

@Todd Gardner, у меня никогда бы не было «Organization.OrganizationID» в запросе, просто «o.OrganizationID». Но у меня никогда не было бы «idOrganization» как FK для «id», попробуйте поддержать это через несколько лет с несколькими сотнями или несколькими тысячами таблиц позже! –

-1

Вы пробовали:

SELECT system.systemName, organization.officeSymbol 
FROM system, organization 
WHERE system.idOrganization = organization.id 

Это должно соединить таблицы вместе должным образом, даже если не все системы назначены организации.

+3

Если я ошибаюсь, это сделает INNER JOIN, а не LEFT JOIN –

+0

@Todd, вы правы –

0

Я действительно не знаю mysql, только sqlserver, однако, используя имена полей, такие как «id» и имена таблиц, такие как «system», я уверен, что квадратная скобка содержит все имена таблиц и столбцов. Может быть стоит сделать снимок?

SELECT 
    [system].[systemName], 
    [organization].[officeSymbol] 
FROM 
    [system] 
LEFT OUTER JOIN 
    [organization] 
ON 
    [system].[idOrganization] = [organization].[id] 
+0

Mysql использует обратный ход ('something'), а не [что-то] –

+0

Спасибо, как я уже сказал, не знаю mysql, была просто идеей, так как сам sql выглядит хорошо. –

-1

Это кажется очень странным для меня, что вы будете получать эту ошибку (хотя мой основной опыт не с MySQL). Я бы попробовал с наложением ваших таблиц.

SELECT s.systemName, o.officeSymbol 
FROM system as s 
LEFT JOIN (organization as o) 
ON (s.idOrganization = o.id) 
1

Не знаете, почему ваш запрос будет генерировать, что: как правило, вы получите, что сообщение об ошибке, когда вы делаете:

SELECT id /* This should have been qualified with system. or organization. */ 
FROM system 
LEFT JOIN (organization) 
ON (system.idOrganization = organization.id) 

Вы уверены, что запрос точно дает вам эту ошибку? Если вы урезали его для SO, вы могли бы вырезать ошибку.

0

Майкл, разместил бы идентификатор в одинарных кавычках (`) (или квадратные скобки, как в SQL Server, или что-то, что работает для mysql) поможет устранить проблему?

... 
ON (system.`idOrganization` = organization.`id`)