Неоднозначное `id` Field - PullRequest
4 голосов
/ 01 июня 2009

У меня есть следующие две таблицы:

system
- id
- systemName
- idOrganization

organization
- id
- officeSymbol

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

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

Как видите, я не выбираю столбец 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;

Ответы [ 7 ]

5 голосов
/ 01 июня 2009

Проверено на 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 вы сказали:

Я выбираю только 5 из 42 полей, общих для этих двух таблиц

Неужели в таблицах и / или запросе есть другие поля?

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

1 голос
/ 01 июня 2009

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

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

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

1 голос
/ 01 июня 2009

Я не уверен, что происходит, так как я недостаточно знаком с mySql, но я всегда предпочитаю называть столбцы, такие как SystemID и OrganizationID, а не генетически, как "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
0 голосов
/ 01 июня 2009

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

...
ON (system.`idOrganization` = organization.`id`)
0 голосов
/ 01 июня 2009

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

SELECT s.systemName, o.officeSymbol
FROM system as s
LEFT JOIN (organization as o)
ON (s.idOrganization = o.id)
0 голосов
/ 01 июня 2009

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

SELECT
    [system].[systemName],
    [organization].[officeSymbol]
FROM
    [system]
LEFT OUTER JOIN
    [organization]
ON
    [system].[idOrganization] = [organization].[id]
0 голосов
/ 01 июня 2009

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

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

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

...