2017-09-04 17 views
0

以下の2つのクエリは同じ結果を出力します。私は最初のものを理解していますが、誰かが2番目のクエリがどのように同じように動作するかを説明することができます。where句なしの結合クエリ

SELECT p0_.name AS name_0 
FROM patient p0_ INNER JOIN consultant c1_ 
ON c1_.id = p0_.consultant_id 
WHERE c1_.id=1; 

SELECT p0_.name AS name_0 
FROM patient p0_ INNER JOIN consultant c1_ 
ON (c1_.id = 1) 
+3

ではありませんそれは 'consultant'テーブルが1つのレコードだけ、ない状態で、ID = 1のものを含んでいると思われる患者の残りのconsultantnameのための一貫性のないデータの結果何も除外しないでください。 – newtover

+0

はい、私はまだレコードが1つしかありません。別のレコードを追加してチェックします。 2番目のクエリはORMによって生成されました。 (教義2)。 –

+1

2番目のクエリはごみです(明らかでない場合に備えて) –

答えて

3

ONY 1行がpatientsテーブルに存在する場合、これらの2つのクエリは、念のために、唯一の一致によって、同じ結果を与えます。
これらのクエリは異なるため、異なる結果が得られます。
この簡単なデモ検討してください:プライマリおよび外部キーの主な理由は、データ 一貫性を強制することですhttp://sqlfiddle.com/#!9/1987a/1

CREATE TABLE patient (
    patient_id int, 
    name varchar(20), 
    consultant_id int 
); 

insert into patient values(1,'Patient 1', 1); 
insert into patient values(2,'Patient 2', 2); 

CREATE TABLE consultant(
    id int 
); 

insert into consultant values(1),(2); 

SELECT p0_.name AS name_0 
FROM patient p0_ INNER JOIN consultant c1_ 
ON c1_.id = p0_.consultant_id 
WHERE c1_.id=1; 

| name_0 | 
|-----------| 
| Patient 1 | 

SELECT p0_.name AS name_0 
FROM patient p0_ INNER JOIN consultant c1_ 
ON (c1_.id = 1) 

| name_0 | 
|-----------| 
| Patient 1 | 
| Patient 2 | 
1

を。

プライマリキーは、1つまたは複数の列に を超える値の一意性の一貫性を強制します。 ID列に主キーがある場合、同じID値を持つ2つの行を持つことは不可能です( )。 プライマリキーがないと、多くの行が同じID値を持つ可能性があり、ID値だけに基づいてそれらを区別することはできません。

外部キーは、他の場所を指すデータの整合性を強制します。 実際に指し示されているデータが確実に存在することを保証します。 典型的な親子関係では、外部キーは、すべて の子が常に親を指し、親が実際に存在することを保証します。 外部キーがないと、存在しない親に を指す "孤立した"子がいる可能性があります。

レコードが1つしかなく、1つの列しか取得できなかったため、データの不一致はありません。

これらの表と列、およびレコードがあるとします。

CREATE TABLE patient (
    patient_id INT, 
    name VARCHAR(20), 
    consultant_id INT 
); 

INSERT INTO patient VALUES(100,'Patient 1', 1); 
INSERT INTO patient VALUES(200,'Patient 2', 1); 
INSERT INTO patient VALUES(300,'Patient 3', 1); 
INSERT INTO patient VALUES(400,'Patient 4', 2); 
INSERT INTO patient VALUES(500,'Patient 5', 2); 
INSERT INTO patient VALUES(600,'Patient 6', 3); 



CREATE TABLE consultant(
    id INT, 
    name VARCHAR(20) 
); 

INSERT INTO consultant VALUES(1,'Consultant 1'); 
INSERT INTO consultant VALUES(2,'Consultant 2'); 
INSERT INTO consultant VALUES(3,'Consultant 3'); 

たちはコンサルタントのためにも名前を持っていることを参照してください、私たちは、キーでなし、クエリで、

SELECT p0_.name AS patientname_0, 
     c1_.name AS consultantname_0 
    FROM patient p0_ 
INNER JOIN consultant c1_ 
    ON c1_.id = p0_.consultant_id 
WHERE (c1_.id = 1); 

結果

patientname_0 consultantname_0 
Patient 1  Consultant 1 
Patient 2  Consultant 1 
Patient 3  Consultant 1 

しかし患者に出席したコンサルタント見てみたかったですON句

SELECT p0_.name AS patientname_0, 
     c1_.name AS consultantname_0 
    FROM patient p0_ 
INNER JOIN consultant c1_ 
    ON (c1_.id = 1); 

は、コンサルタント1

patientname_0 consultantname_0 
Patient 1  Consultant 1 
Patient 2  Consultant 1 
Patient 3  Consultant 1 
Patient 4  Consultant 1 
Patient 5  Consultant 1 
Patient 6  Consultant 1