4

次の2つのテーブルがあります。

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;
4

7 に答える 7

5

テスト済み5.0.77

SELECT VERSION();

バージョン()
5.0.77


CREATE TABLE組織(
  `id` INT(11)NOT NULL AUTO_INCREMENT、
  `officeSymbol` VARCHAR(45)DEFAULT NULL、
  主キー( `id`)
)ENGINE = InnoDB DEFAULT CHARSET = latin1;
CREATE TABLEシステム(
  `id` INT(11)NOT NULL AUTO_INCREMENT、
  `systemName` VARCHAR(45)DEFAULT NULL、
  `idOrganization` INT(11)DEFAULT NULL、
  主キー( `id`)、
  キー`fk_system_organization`(` idOrganization`)、
  制約`fk_system_organization`
    外部キー( `idOrganization`)
    参考資料`組織`(` id`)
    アクションなしの削除時アクションなしの更新時
)ENGINE = InnoDB DEFAULT CHARSET = latin1;

入れる
INTO組織
値
        (1、'組織1')、
        (2、'組織2');
入れる
INTOシステム
値(1、'システム1'、1)、
        (2、'システム2'、2);
SELECT system.systemName、organization.officeSymbol
FROMシステム
左参加
        (組織)
オン(system.idOrganization = Organization.id);

systemName officeSymbol
システム1組織1
システム2組織2

すべてが正常に動作します。

toLEFT JOINがあるので、ここでは役に立たないことに注意してください。また、与えられたすべてのに対して常にforがあります。FOREIGN KEYorganizationorganizationsystem

の投稿へのコメントで、@Artem Bargerあなたは次のように述べました。

これら2つのテーブル間で共有される42のフィールドのうち5つだけを選択しています

テーブルやクエリに他のフィールドがあるということですか?

構文エラーがあるため、すべてのコンマが重要になる場合があります。

于 2009-06-01T15:47:17.733 に答える
1

クエリがそれを生成する理由がわからない:通常、次の場合にエラーメッセージが表示されます。

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

クエリが正確にそのエラーを出していると確信していますか?SO用にトリミングした場合は、バグを切り取った可能性があります。

于 2009-06-01T15:44:52.990 に答える
1

mySqlに精通していないため、何が起こっているのかわかりませんが、「ID」のように一般的にではなく、SystemIDやOrganizationIDのような列に名前を付けることを常に好みます。

このように列に名前を付けると、同じ名前のPK-FKの組み合わせになります。

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

organization          organization
  id                    OrganizationID  <--
  officeSymbol          officeSymbol
于 2009-06-01T15:29:11.690 に答える
0

mysqlはわかりませんが、sqlserverだけですが、「id」などのフィールド名や「system」などのテーブル名を使用する場合は、必ずすべてのテーブル名と列名を角かっこで囲んでください。一撃の価値があるかもしれませんか?

SELECT
    [system].[systemName],
    [organization].[officeSymbol]
FROM
    [system]
LEFT OUTER JOIN
    [organization]
ON
    [system].[idOrganization] = [organization].[id]
于 2009-06-01T15:38:53.007 に答える
0

Michael、IDを一重引用符( `)(または、SQL Serverのように角かっこ、またはmysqlで機能するもの)に入れると、問題の修正に役立ちますか?

...
ON (system.`idOrganization` = organization.`id`)
于 2009-06-01T16:22:12.020 に答える
-1

あなたがそのエラーを受け取ることは私には非常に奇妙に思えます(私の主な経験はmysqlではありませんが)。テーブルのエイリアスを試してみます。

SELECT s.systemName, o.officeSymbol
FROM system as s
LEFT JOIN (organization as o)
ON (s.idOrganization = o.id)
于 2009-06-01T15:43:11.850 に答える
-1

やってみました:

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

これにより、すべてのシステムが組織に割り当てられているわけではない場合でも、テーブルを適切に結合する必要があります。

于 2009-06-01T15:34:10.620 に答える