মাল্টি পার্ট শনাক্তকারীকে আবদ্ধ করা যায় না


196

আমি এসও তে অনুরূপ ত্রুটিগুলি দেখেছি, তবে আমি আমার সমস্যার সমাধান পাই না। আমার মতো এসকিউএল কোয়েরি রয়েছে:

SELECT DISTINCT
        a.maxa ,
        b.mahuyen ,
        a.tenxa ,
        b.tenhuyen ,
        ISNULL(dkcd.tong, 0) AS tongdkcd
FROM    phuongxa a ,
        quanhuyen b
        LEFT OUTER JOIN ( SELECT    maxa ,
                                    COUNT(*) AS tong
                          FROM      khaosat
                          WHERE     CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                                              AND
                                                              'Sep 5 2011'
                          GROUP BY  maxa
                        ) AS dkcd ON dkcd.maxa = a.maxa
WHERE   a.maxa <> '99'
        AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;

আমি যখন এই কোয়েরিটি সম্পাদন করি তখন ত্রুটির ফলাফল: মাল্টি পার্ট শনাক্তকারী "a.maxa" আবদ্ধ হতে পারে না। কেন?
পি / এস: যদি আমি কোয়েরিকে 2 টি পৃথক ক্যোয়ারিতে ভাগ করি তবে এটি ঠিক আছে।

SELECT DISTINCT
        a.maxa ,
        b.mahuyen ,
        a.tenxa ,
        b.tenhuyen
FROM    phuongxa a ,
        quanhuyen b
WHERE   a.maxa <> '99'
        AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;

এবং

SELECT  maxa ,
        COUNT(*) AS tong
FROM    khaosat
WHERE   CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                        AND     'Sep 5 2011'
GROUP BY maxa;

phuongxaসারণীতে কি একটি কলাম অন্তর্ভুক্ত রয়েছে maxa?
মাইকেল পেট্রোটা 6'11

1
আপনি ম্যাক্সা, টোঙ্গ - দ্বারা ঠিক 5 সেপ্টেম্বর 2011 এর পরে গ্রুপ যুক্ত করলে কি হয়?
ব্যবহারকারী 710502

হ্যাঁ, আছে। যদি আমি ক্যোয়ারিকে 2 টি সাবকিউরিতে বিভক্ত করি তবে এটি ঠিক আছে
ফামমিনহ

আপনার মতো মনে হচ্ছে আপনি ভুল ডাটাবেসে চালাচ্ছেন। ক্যোয়ারির শুরুতে একটি "ইউএসই [ডাটাবেস নাম]" বিবৃতি যুক্ত করুন এবং দেখুন যে আপনি এখনও ত্রুটি পেয়েছেন কিনা।
ব্রায়ান

1
না, আমি উপরে বলেছি, যদি আমি কোয়েরিকে 2 টি পৃথক ক্যোয়ারিতে ভাগ করি তবে এটি ওকে চালিত হবে।
ফামমিনহ

উত্তর:


226

আপনি সুস্পষ্ট যোগদানের সাথে অন্তর্ভুক্ত যোগদানের মিশ্রণ করছেন। এটি অনুমোদিত, তবে কীভাবে এটি সঠিকভাবে করা যায় সে সম্পর্কে আপনার সচেতন হওয়া দরকার।

বিষয়টি হ'ল সুস্পষ্ট যোগদানের সাথে (মূল JOINশব্দটি ব্যবহার করে প্রয়োগ করা হয় ) অন্তর্নিহিতগুলির চেয়ে প্রাধান্য পায় ('কমা' যোগ দেয়, যেখানে যুক্তির শর্তটি নির্দিষ্ট করা আছে WHERE)।

আপনার ক্যোয়ারির একটি রূপরেখা এখানে দেওয়া হয়েছে:

SELECT
  
FROM a, b LEFT JOIN dkcd ON 
WHERE 

আপনি সম্ভবত এটি এরকম আচরণ করার প্রত্যাশা করছেন:

SELECT
  
FROM (a, b) LEFT JOIN dkcd ON 
WHERE 

যে টেবিল সংমিশ্রণ aএবং bটেবিল সাথে মিলিত থাকে dkcd। আসলে যা হচ্ছে তা হচ্ছে

SELECT
  
FROM a, (b LEFT JOIN dkcd ON …)
WHERE 

এটি, যেমন আপনি ইতিমধ্যে বুঝতে পেরেছেন, dkcdবিশেষভাবে এর বিরুদ্ধে bএবং কেবলমাত্র যোগ হয়েছে b, তারপরে যোগদানের ফলাফলটি একত্রিত করা হয় aএবং WHEREধারাটির সাথে আরও ফিল্টার করা হয় । এই ক্ষেত্রে, কোনো রেফারেন্স aমধ্যে ONদফা অবৈধ,a যে সময়ে অজানা। এজন্য আপনি ত্রুটির বার্তা পাচ্ছেন।

আমি যদি আপনি হয়ে থাকি তবে আমি সম্ভবত এই কোয়েরিটি আবার লেখার চেষ্টা করতাম এবং এর একটি সম্ভাব্য সমাধান হতে পারে:

SELECT DISTINCT
  a.maxa,
  b.mahuyen,
  a.tenxa,
  b.tenhuyen,
  ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a
  INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen
  LEFT OUTER JOIN (
    SELECT
      maxa,
      COUNT(*) AS tong
    FROM khaosat
    WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011'
    GROUP BY maxa
  ) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> '99'
ORDER BY a.maxa

এখানে টেবিলগুলি aএবং bপ্রথমে যোগদান করা হয়, তারপরে ফলাফলটি যুক্ত হয় dkcd। রেফারেন্স: মূলত, এটা কি তোমার মত একই ক্যোয়ারী শুধুমাত্র যোগদান করে, যা একটি বড় পার্থক্য তোলে এক জন্য একটি ভিন্ন সিনট্যাক্স ব্যবহার করছে, a.maxaএর মধ্যে dkcd's তে যোগ শর্ত এখন একেবারে বৈধ।

যেমন @ অ্যারন বার্ট্র্যান্ড সঠিকভাবে উল্লেখ করেছে, আপনার সম্ভবত সম্ভবত maxaএকটি নির্দিষ্ট উচ্ছ্বাসের সাথে যোগ্যতা অর্জন করা উচিত , সম্ভবত a, ORDER BYদফায়।


অর্ডার বাই ম্যাক্সা এখনও অস্পষ্ট, না? এছাড়াও আমি 'সেপ্টেম্বর 1 ২০১১' তারিখ হিসাবে সতর্ক থাকব, ভিন্ন ভাষা / আঞ্চলিক সেটিংসের সাথে কাজ করবে না।
অ্যারন বারট্রান্ড

@ অ্যারন: ORDER BY maxaধন্যবাদ, ধন্যবাদ। তারিখগুলি হিসাবে, আমি বিশ্বাস করি যে ওপি তাদের পরিবেশে তাদের নির্দিষ্ট করতে বেছে নিয়েছে।
অ্যান্ড্রি এম

"স্পষ্টত যোগ দেয় ... অন্তর্নিহিতদের চেয়ে প্রাধান্য পান" - আপনি কি এর জন্য একটি প্রশংসা প্রদান করতে পারেন, দয়া করে? যেমন এসকিউএল স্ট্যান্ডার্ডগুলিতে সংজ্ঞায়িত করা হয় বা এটি কোনও পণ্য বৈশিষ্ট্য? ধন্যবাদ।
onedaywhen

1
@ মাওনাদেউহেন: আমি আশঙ্কা করছি এটি এখন পর্যন্ত আমার পক্ষে পর্যবেক্ষণ ছাড়া আর কিছু নয়। আমি এখানে যোগদানের নজির সম্পর্কে প্রথমে কথা বলতে পারি না তা থেকে কিছুটা হলেও স্বস্তি পেয়েছি , তবে তা ছাড়া আমি নিজেও কোনও ধরণের অফিসিয়াল কনফার্মেশন পেয়ে খুশি হব।
অ্যান্ড্রি এম

1
আমার ক্ষেত্রে, আমি বেক্তিটি তৈরির জন্য স্ট্রিংগুলি সংঘবদ্ধ করার সময় ফাঁকা স্থানগুলি ভুলে যাচ্ছিলাম, সুতরাং 'FROM dbo.table_a a' + 'INNER JOIN dbo.table_b b' হয়ে গেল 'FROM dbo.table_a aINNer JOIN dbo.table_b b', এবং এটি বিভ্রান্ত হয়ে পড়ে এবং আমাকে এই ত্রুটি বার্তা দেয়। বিশদ, বিশদ, বিশদ।
গাই শালনাট

40

কখনও কখনও এই ত্রুটিটি ঘটে যখন আপনি আপনার ক্যোয়ারিতে ভুল পদ্ধতিতে আপনার স্কিমা (ডিবিও) ব্যবহার করেন।

উদাহরণস্বরূপ যদি আপনি লিখেন:

select dbo.prd.name
from dbo.product prd

আপনি ত্রুটি পাবেন।

এই পরিস্থিতিতে এটিকে পরিবর্তন করুন:

select prd.name
from dbo.product prd

1
এটি বেশ বিরক্তিকর এবং এটি বের করার জন্য আমাকে অনেক দীর্ঘ সময় নিয়েছে। ধন্যবাদ। সবচেয়ে বিরক্তিকর অংশটি কখনও কখনও এটি সম্পর্কে কটাক্ষ হয় তবে অন্যান্য সময় এটি
সাধারণভাবে

12

আপনি যদি এলিজের নাম দিয়ে থাকেন তবে সেই নামটি প্রকৃত নামে পরিবর্তন করুন

উদাহরণ স্বরূপ

SELECT  
    A.name,A.date
  FROM [LoginInfo].[dbo].[TableA] as A
   join 
  [LoginInfo].[dbo].[TableA] as B 
  on  [LoginInfo].[dbo].[TableA].name=[LoginInfo].[dbo].[TableB].name;

যে পরিবর্তন

SELECT  
    A.name,A.date
  FROM [LoginInfo].[dbo].[TableA] as A
   join 
  [LoginInfo].[dbo].[TableA] as B 
  on  A.name=B.name;

1
এছাড়াও আপনি যদি স্কয়ার স্ট্রিংটি তৈরি করে থাকেন তবে লাইনের শেষের দিকে পিছনের জায়গাগুলির অভাবে নজর রাখুন। এটি নীচের পরবর্তী INNER যোগ লাইনে যোগদান করার পরে এটি আমার ওরফে এমকে MINNER এ রূপান্তরিত করে। এসকিউএল প্রোফাইলার কার্যকর করা স্ট্রিংটি দেখিয়ে আমার সমস্যা সমাধানে সহায়তা করেছে। (এটি উপনাম v আসল নাম ইস্যু সম্পর্কিত বলে এখানে মন্তব্য করা হয়েছে)
সাইমন

বাহ @ সিমন আপনাকে ধন্যবাদ আমি এমনকি এটি সম্পর্কে চিন্তাও করতে পারি নি এবং আমার জিজ্ঞাসাটি কেন কাজ করছে না তা জানার চেষ্টা করার জন্য প্রাচীরের বিরুদ্ধে মাথা ঘুরিয়ে দিচ্ছিলাম, আমি স্ট্রিং ক্যারিজের রিটার্নের শেষে একটি জায়গা হারিয়েছিলাম!
ব্র্যাড করা হয়েছে

9

আমি এসকিউএল সার্ভার একই ভুল বার্তা দিয়ে যেহেতু আমি একাধিক ছিল অগ্রহায়ণ সংগ্রাম ছিল, পরিবর্তন অগ্রহায়ণ ক্রম আমার জন্য এটি সমাধান।


3

আমার ক্ষেত্রে বিষয়টি টেবিলে দেওয়া উপনামের নাম হিসাবে পরিণত হয়েছে। "OA" এসকিউএল সার্ভারের জন্য গ্রহণযোগ্য হবে না বলে মনে হচ্ছে।


2

জেডিবিসি থেকে আমারও একই ত্রুটি ছিল। সমস্ত কিছু পরীক্ষা করে দেখুন এবং আমার জিজ্ঞাসা ভাল ছিল। দেখা গেছে, যেখানে আমার একটি যুক্তি রয়েছে use

where s.some_column = ?

এবং আমি যে যুক্তিটির মধ্যে দিয়ে যাচ্ছিলাম তার মূল্য ন্যূন ছিল। এটি একই ত্রুটিটিও দেয় যা বিভ্রান্তিমূলক কারণ কারণ আপনি যখন ইন্টারনেটে অনুসন্ধান করেন আপনি শেষ করেন যে ক্যোয়ারী কাঠামোর সাথে কিছু ভুল হয়েছে তবে এটি আমার ক্ষেত্রে নয়। ভেবেছিলেন কেউ একই সমস্যার মুখোমুখি হতে পারে


2

আমার জন্য যা কাজ করেছিল তা হ'ল আমার নিখরচায় অনুচ্ছেদটি একটি নির্বাচন উপকণায় পরিবর্তন করা

থেকে:

    DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = [dbo].FetchedTagTransferData.IssueId

প্রতি:

    DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = (SELECT NoteId FROM FetchedTagTransferData)

1

আমি এসকিউএল-এ নতুন, তবে আমি যে কোর্সটি নিচ্ছিলাম তাতে এই সমস্যাটি এসেছিল এবং দেখেছি যে প্রকল্পটিতে ক্যোয়ারী অর্পণ করা বিশেষত বহু-অংশ ত্রুটি দূর করতে সহায়তা করেছে। উদাহরণস্বরূপ, আমি যে প্রকল্পটি তৈরি করেছি তা হ'ল সিটিইউ এসকিউএল প্রজেক্ট তাই আমি নিশ্চিত করেছি যে আমি আমার স্ক্রিপ্টটি নীচের মত আমার প্রথম লাইন হিসাবে ব্যবহার [সিটিইউ এসকিউএল প্রকল্প] দিয়ে শুরু করেছি।

USE [CTU SQL Project]
SELECT Advisors.First_Name, Advisors.Last_Name...and so on.

1
আপনি যখন "প্রকল্প" বলবেন আমি ধরে নিয়েছি আপনার অর্থ ডেটাবেস এবং প্রক্ষেপণ নয়। ব্যবহারের বিবৃতিটি কেবল কোন ডাটাবেসে আপনি কোয়েরিটি
স্কোপ করছেন

হ্যাঁ, চারলেহ প্রকল্পটি যেমন আমি কাজ করছিলাম সেই ডাটাবেজে। আমি আমার ডেটাবেসটিতে কী ভুল করছি তা নিশ্চিত ছিলাম না, তবে "ব্যবহার" এবং স্কোপের নির্দিষ্ট ডেটাবেস উল্লেখ করে আমার ত্রুটি দূর করে eliminated
বোগার্টজ

1

যদি এই ত্রুটিটি ঘটে থাকে তবে কলাম / ক্ষেত্রের সাহায্যে টেবিলে UPDATEডাবল-চেক করুন JOINযা ত্রুটি সৃষ্টি করছে।

আমার ক্ষেত্রে এটি JOINনিজের অভাবের কারণে হয়েছিল , যা অজানা ক্ষেত্রের কারণে একই সমস্যা তৈরি করেছিল ( অ্যান্ড্রি দেখিয়েছে )।


1

পরিবর্তে আপনি টেবিলগুলিতে যোগদানের চেষ্টা করতে পারেন,

select 
  .... 
from 
   dkcd 
     right join 
                a
                  , b

এই কাজ করা উচিত


1
SELECT DISTINCT
        phuongxa.maxa ,
        quanhuyen.mahuyen ,
        phuongxa.tenxa ,
        quanhuyen.tenhuyen ,
        ISNULL(dkcd.tong, 0) AS tongdkcd
FROM    phuongxa ,
        quanhuyen
        LEFT OUTER JOIN ( SELECT    khaosat.maxa ,
                                    COUNT(*) AS tong
                          FROM      khaosat
                          WHERE     CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                                              AND
                                                              'Sep 5 2011'
                          GROUP BY  khaosat.maxa
                        ) AS dkcd ON dkcd.maxa = maxa
WHERE   phuongxa.maxa <> '99'
        AND LEFT(phuongxa.maxa, 2) = quanhuyen.mahuyen
ORDER BY maxa;

মাল্টি-পার্ট বাউন্ড ইস্যু যদি উঠে আসে তবে নিজের নাম ব্যবহারের পরিবর্তে টেবিলের নাম ব্যবহার করুন।
এসভিদ্যা

1

আমার ত্রুটিটি এমন ক্ষেত্রটি ব্যবহার করা ছিল যা সারণীতে উপস্থিত নেই।

table1.field1 => বিদ্যমান নেই

table2.field1 => সঠিক

আপনার সারণির নাম সংশোধন করুন।

WITH ব্যবহারের কারণে আমার ত্রুটি ঘটেছে

WITH RCTE AS (
   SELECT...
)
SELECT RCTE.Name, ...
FROM 
  RCTE INNER JOIN Customer
  ON RCTE.CustomerID = Customer.ID 

যখন অন্য টেবিলের সাথে যোগদানের জন্য ব্যবহৃত হয় ...


1

আপনি কিছু টেবিলে যোগদান করতে ভুলে গেছেন? যদি তা না হয় তবে আপনার সম্ভবত কিছু এলিয়াস ব্যবহার করা দরকার।


1

আমিও এই ত্রুটির সাথে লড়াই করেছিলাম এবং উত্তর হিসাবে একই কৌশলটি শেষ করেছি। আমি আমার উত্তরটি অন্তর্ভুক্ত করছি কেবল এটি নিশ্চিত করার জন্য যে এটি একটি কৌশল যা কাজ করা উচিত।

এখানে উদাহরণ রয়েছে যেখানে আমি প্রথমে একটি অভ্যন্তরীণ সংযুক্তি দুটি টেবিলের মধ্যেই পেয়েছি যা আমার কাছে তথ্য পেয়েছে এবং তারপরে দুটি বাম বাহিরের বাইরের সাথে টেবিলগুলিতে মিলিত হতে পারে যা খালি থাকতে পারে correspond আপনি টেবিলের মধ্যে ডিফল্ট কমা বিচ্ছিন্ন সিনট্যাক্স না করে তথ্য সংগ্রহের টেবিলের সাথে ফলাফল পেতে অভ্যন্তরীণ যোগগুলিতে এবং বাহ্যিক যোগদানগুলিতে মিশ্রিত হন এবং আপনার পছন্দসই জোড়ায় সারিগুলি মিস করবেন।

use somedatabase
go 

select o.operationid, o.operatingdate, p.pasid, p.name as patientname, o.operationalunitid, f.name as operasjonsprogram,  o.theaterid as stueid, t.name as stuenavn, o.status as operasjonsstatus from operation o 
inner join patient p on o.operationid = p.operationid 
left outer join freshorganizationalunit f on f.freshorganizationalunitid = o.operationalunitid
left outer join theater t on t.theaterid = o.theaterid
where (p.Name like '%Male[0-9]%' or p.Name like '%KFemale [0-9]%')

প্রথম: আপনি যে টেবিলগুলির সাথে ডেটা ম্যাচিংয়ের প্রত্যাশা করছেন তার মধ্যে অভ্যন্তরীণ সংযুক্ত হবে। দ্বিতীয় অংশ: অন্যান্য টেবিলগুলিতে ডেটা পুনরুদ্ধার করার চেষ্টা করার জন্য বহিরাগত যোগদানের সাথে চালিয়ে যান, তবে যদি টেবিলের বাইরের যোগদানের সাথে প্রেজিকেট / শর্তে আপনি যে শর্তে সেট আপ করেন তার সাথে সম্পর্কিত ডেটা না মিলে বা আপনার ফলাফল সেটটি ফিল্টার করে না।


0

এই ত্রুটিটি কেবল ,নির্বাচন বিবৃতিতে কলামের নামের মধ্যে কমা না পেয়েও ঘটতে পারে ।

উদাহরণ:

SELECT MyCol1, MyCol2 MyCol3 FROM SomeTable;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.