سؤال

نرى أهمية الاكتشافات الجديدة 1 و 2 في نهاية هذا التفسير.

أنا على التوالي بوستجرس 9.1.3 و أواجه غريب اليسار الانضمام المسألة.

عندي جدول اسمه متسقة.ماجستير مع أكثر من 2 مليون الصفوف.وقد عمود اسمه citation_id, و هذا العمود ليس له بالقيم الخالية.لا يمكن التحقق من ذلك مع هذا:

SELECT COUNT(*)
FROM consistent.master
WHERE citation_id IS NULL

أن يعود 0.

هنا حيث يحصل غريب:إذا كنت LEFT JOIN هذا الجدول إلى جدول مؤقت, أحصل على خطأ أن أحاول إدراج فارغة إلى citation_id مجال:

خطأ:قيمة فارغة في العمود "citation_id" ينتهك غير-null القيد SQL الدولة:23502

هنا الاستعلام:

WITH stops AS (
    SELECT citation_id,
           rank() OVER (ORDER BY offense_timestamp,
                     defendant_dl,
                     offense_street_number,
                     offense_street_name) AS stop
    FROM   consistent.master
    WHERE  citing_jurisdiction=1
)

INSERT INTO consistent.masternew (arrest_id, citation_id, defendant_dl, defendant_dl_state, defendant_zip, defendant_race, defendant_sex, defendant_dob, vehicle_licenseplate, vehicle_licenseplate_state, vehicle_registration_expiration_date, vehicle_year, vehicle_make, vehicle_model, vehicle_color, offense_timestamp, offense_street_number, offense_street_name, offense_crossstreet_number, offense_crossstreet_name, offense_county, officer_id, offense_code, speed_alleged, speed_limit, work_zone, school_zone, offense_location, id, source, citing_jurisdiction, the_geom)

SELECT stops.stop, master.citation_id, defendant_dl, defendant_dl_state, defendant_zip, defendant_race, defendant_sex, defendant_dob, vehicle_licenseplate, vehicle_licenseplate_state, vehicle_registration_expiration_date, vehicle_year, vehicle_make, vehicle_model, vehicle_color, offense_timestamp, offense_street_number, offense_street_name, offense_crossstreet_number, offense_crossstreet_name, offense_county, officer_id, offense_code, speed_alleged, speed_limit, work_zone, school_zone, offense_location, id, source, citing_jurisdiction, the_geom
FROM consistent.master LEFT JOIN stops
ON stops.citation_id = master.citation_id

أنا الخدش رأسي على هذا واحد.إذا كان هذا هو LEFT JOIN, و إذا متسقة.ماجستير هو الانضمام إلى يسار الجدول كيف يمكن الاستعلام خلق قيم فارغة في citation_id العمود عندما لم تكن هناك أي لتبدأ ؟

هنا SQL البرمجية التي استخدمتها لإنشاء الجدول:

CREATE TABLE consistent.masternew
(
  arrest_id character varying(20),
  citation_id character varying(20) NOT NULL,
  defendant_dl character varying(20),
  defendant_dl_state character varying(2),
  defendant_zip character varying(9),
  defendant_race character varying(10),
  defendant_sex character(1),
  defendant_dob date,
  vehicle_licenseplate character varying(10),
  vehicle_licenseplate_state character(2),
  vehicle_registration_expiration_date date,
  vehicle_year integer,
  vehicle_make character varying(20),
  vehicle_model character varying(20),
  vehicle_color character varying,
  offense_timestamp timestamp without time zone,
  offense_street_number character varying(10),
  offense_street_name character varying(30),
  offense_crossstreet_number character varying(10),
  offense_crossstreet_name character varying(30),
  offense_county character varying(10),
  officer_id character varying(20),
  offense_code integer,
  speed_alleged integer,
  speed_limit integer,
  work_zone bit(1),
  school_zone bit(1),
  offense_location point,
  id serial NOT NULL,
  source character varying(20), -- Where this citation came from--court, PD, etc.
  citing_jurisdiction integer,
  the_geom geometry,
  CONSTRAINT masternew_pkey PRIMARY KEY (id ),
  CONSTRAINT citing_jurisdiction FOREIGN KEY (citing_jurisdiction)
      REFERENCES consistent.jurisdictions (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT offenses FOREIGN KEY (offense_code)
      REFERENCES consistent.offenses (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2),
  CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) = 'POINT'::text OR the_geom IS NULL),
  CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 3081)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE consistent.masternew
  OWNER TO postgres;
COMMENT ON COLUMN consistent.masternew.source IS 'Where this citation came from--court, PD, etc.';

CREATE INDEX masternew_citation_id_idx
  ON consistent.masternew
  USING btree
  (citation_id COLLATE pg_catalog."default" );

CREATE INDEX masternew_citing_jurisdiction_idx
  ON consistent.masternew
  USING btree
  (citing_jurisdiction );

CREATE INDEX masternew_defendant_dl_idx
  ON consistent.masternew
  USING btree
  (defendant_dl COLLATE pg_catalog."default" );

CREATE INDEX masternew_id_idx
  ON consistent.masternew
  USING btree
  (id );

CREATE INDEX masternew_offense_street_name_idx
  ON consistent.masternew
  USING btree
  (offense_street_name COLLATE pg_catalog."default" );

CREATE INDEX masternew_offense_street_number_idx
  ON consistent.masternew
  USING btree
  (offense_street_number COLLATE pg_catalog."default" );

CREATE INDEX masternew_offense_timestamp_idx
  ON consistent.masternew
  USING btree
  (offense_timestamp );

CREATE INDEX masternew_the_geom_idx
  ON consistent.masternew
  USING gist
  (the_geom );

الاكتشاف المهم 1

لقد اكتشفت شيئا مثيرا للاهتمام.هذا الاستعلام:

SELECT COUNT(*)
FROM consistent.master
WHERE citation_id IS NOT NULL
UNION
SELECT COUNT(*)
FROM consistent.master
UNION
SELECT COUNT(*)
FROM consistent.master
WHERE citation_id IS NULL

النتائج:

2085344
2085343
0

كيف يمكنني أن أشرح ذلك ؟ كيف يمكن الاعتماد مع WHERE citation_id IS NOT NULL ربما يكون أعلى من نفس الاستعلام لا WHERE الحدوث ؟

اكتشاف هام 2 حسنا ، في التعليقات أدناه ، اكتشفت أن لدي صف واحد مع كل القيم الفارغة ، وهذا هو على الرغم من حقيقة أن الجدول يحتوي على المسلسل id عمود بعض NOT NULL قيود.

أنا حذفت بوم الصف.الآن أنا لا تحصل على باطل خطأ.بدلا من ذلك, أنا على الحصول على هذا:

ERROR:  duplicate key value violates unique constraint "masternew_pkey"
DETAIL:  Key (id)=(1583804) already exists.

********** Error **********

ERROR: duplicate key value violates unique constraint "masternew_pkey"
SQL state: 23505
Detail: Key (id)=(1583804) already exists.

وذلك فقط للتأكد من أنني أفعل هذا الاستعلام:

SELECT COUNT(id)
FROM consistent.master
WHERE id=1583804;

تخمين ما ؟ consistent.master فقط 1 سبيل المثال من هذا!ذلك بالنظر إلى أن الجدول الأيسر في LEFT JOIN فقط 1 مثيل 1583804 في citation_id و أن معرف عمود يمكن أن تأتي إلا من الجدول الأيسر ، كيف يمكن هذا خطأ ربما يحدث ؟ A LEFT JOIN مثل هذا لا ينبغي أن يسبب النتيجة النهائية أن يكون أكثر من الصفوف من الجدول الأيسر, صحيح ؟

هل كانت مفيدة؟

المحلول

مع إدراج خاصة مع مجمع واحد ، يجب أن دائما تحديد الهدف الأعمدة.حتى جعل ذلك:

INSERT INTO consistent.masternew (citation_id, col1 col2،...)

إذا كان أي شيء يذهب على نحو خاطئ في المرافق SELECT مثل هذا:

the_geom geometry

(لا معنى تسمية العمود مع اسم النوع - أفترض أن هذا غير مقصودة) - أو إذا الأساسية تعريف الجدول التغييرات إدراج بيان دون تحديد الهدف الأعمدة يمكن أن يذهب خطأ فادحا.

كيو لا يفرض نفس عدد الأعمدة في عبارة SELECT كما في الجدول الهدف.أقتبس غرامة دليل على ذلك:

كل عمود غير موجود في صريح أو ضمني عمود القائمة تكون مليئة قيمة افتراضية ، إما المعلنة القيمة الافتراضية أو لاغية إذا كان هناك لا شيء.

(جريئة التشديد من الألغام.) إذا كان لديك عدم تطابق في عمود قائمة ، وهذا يمكن أن يجعل قيمة فارغة تظهر "من العدم".

أيضا ، ترتيب الأعمدة في عبارة SELECT إلى تطابق ترتيب الأعمدة إدراج.إذا كان الهدف الأعمدة لا يتم توضيح هذا سيكون ترتيب الأعمدة في الجدول الخاص بك كما تم إنشاؤه.
يبدو أنك تتوقع أن الأعمدة يقابله اسم تلقائيا ، ولكن هذا ليس كذلك.أسماء الأعمدة في بيان حدد يمتان على الخطوة الأخيرة من إدراج.فقط ترتيبها من اليسار إلى اليمين كبير.

خلافا للآخرين ما قد ضمنا مع شرط شرعي تماما.أقتبس دليل على إدراج:

فمن الممكن الاستعلام (SELECT) أن تحتوي أيضا على مع البند.في هذه الحالة كل من مجموعات من with_query يمكن الرجوع إليها في الاستعلام ولكن والثاني يأخذ الأسبقية منذ أكثر عن كثب متداخلة.

البيان الخاص بك يمكن أن تبدو مثل هذا:

WITH stops AS (
    SELECT citation_id
          ,rank() OVER (ORDER BY
                    offense_timestamp
                   ,defendant_dl
                   ,offense_street_number
                   ,offense_street_name) AS stop
    FROM   consistent.master
    WHERE  citing_jurisdiction = 1
    )
INSERT INTO consistent.masternew (citation_id, col1, col2, ...) -- add columns
SELECT m.citation_id -- order colums accordingly!
      ,s.stop
      ,m.defendant_dl
        -- 27 more columns
      ,m.citing_jurisdiction
      ,m.the_geom
FROM   consistent.master m
LEFT   JOIN stops s USING (citation_id);

نصائح أخرى

في تخمين أود أن أقول أن كنت إدخال توقف.توقف, والتي يمكن أن تكون فارغة ، في citation_id العمود ، ولكن من دون معرفة بنية الجدول لا أستطيع أن أقول على وجه اليقين :)

تحرير:محاولة @vol7ron اقتراح اسم الأعمدة...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top