2017-11-30 13 views
-2

に参加し、私はC#の で動的SQLクエリを作成していために参加が、コードはアウトプットがMS SQLインナーこんにちは私はインナーに関する問題を抱えているためエラー

select p.CategoryId,p.Name,[dbo].CampaignProduct.CampaignId, 
[dbo].CampaignProduct.ProductId,[dbo].Category.Name 
from CampaignProduct 
inner join Category ON p.CategoryId=Category.Id 
Inner join Campaign ON CampaignProduct.CampaignId=Campaign.Id 
Inner join Product p ON CampaignProduct.ProductId=p.Id 

が、このクエリカントの仕事である実行時に。しかし、これを私に変更するとき

select p.CategoryId,p.Name,[dbo].CampaignProduct.CampaignId,[dbo].CampaignProduct.ProductId,[dbo].Category.Name 
from CampaignProduct 
Inner join Product p ON CampaignProduct.ProductId=p.Id 
inner join Category ON p.CategoryId=Category.Id 
Inner join Campaign ON CampaignProduct.CampaignId=Campaign.Id 

私の問題はこれを解決するチャンスがあるのですか?または、私は注文内部結合をコードする必要がありますか?

私のコードブロックここ

string qry = ""; 
      string select = "select "; 
      string from = " from "; 
      string firstfrom = ""; 
      string inners = ""; 
      var res=JsonConvert.DeserializeObject<List<QueryCreatorType>>(data); 

      foreach (var item in res) 
      { 
       select += $"[dbo].{item.Table}.{item.Column},"; 
       if (String.IsNullOrEmpty(firstfrom)) 
       { 
        firstfrom += $" {item.Table}"; 
       } 
       if (!String.IsNullOrEmpty(item.Parent)) 
       { 

        inners += $" Inner join {item.Parent} ON {item.Table}.{item.Column}={item.Parent}.Id"; 

       } 



      } 

      qry = select + from+firstfrom+inners; 
+0

結合名にエイリアスを付けることを忘れないでください。その良い練習 – plaidDK

+0

私はそれを知っているが、それはあなたに何かを変更しないでください。 –

+0

'または私は注文内部結合をコードする必要がありますか? 'はい。 – mjwills

答えて

0

少しテスト可能な例:書くためのより組織的な方法以下

--drop table CampaignProduct 
--drop table Campaign 
--drop table Product 
--drop table Category 
--GO 

create table CampaignProduct(CampaignId int, ProductId int) 
create table Campaign(Id int, Name varchar(100)) 
create table Product(Id int, Name varchar(100), CategoryId int) 
create table Category(Id int, Name varchar(100)) 
GO 

insert into Category values 
(1,'Eletronics'), 
(2,'Footwear'), 
(3,'Toys') 

insert into Product values 
(1,'Tablet',1), 
(2,'Cheap Radio',1), 
(3,'Television',1), 
(4,'Cheap Jogging Tenis',2), 
(5,'Bazillian leather boot',2), 
(6,'Red Prada for Rich Woman',2), 
(7,'Overexpensive Plastic Doll',3), 
(8,'Overexpensive Plastic Action Movie Action Figure',3), 
(9,'Cheap Yo-Yo',3) 

insert into Campaign values 
(1, 'Eletronics Sales'), 
(2, 'For all ages girls'), 
(3, 'Cheap stuff') 

insert into CampaignProduct values 
(1,1),(1,2),(1,3), 
(2,1),(1,6),(1,7), 
(3,2),(1,4),(1,9) 

GO 

取り組んお問い合わせあなたの下

select 
pr.CategoryId 
,pr.Name 
,cp.CampaignId 
,cp.ProductId 
,ct.Name 
from Product pr 
join Category ct On pr.CategoryId = ct.Id 
join CampaignProduct cp On cp.ProductId = pr.Id 
join Campaign cm On cm.Id = cm.Id 

select 
p.CategoryId 
,p.Name 
,[dbo].CampaignProduct.CampaignId 
,[dbo].CampaignProduct.ProductId 
,[dbo].Category.Name 
from CampaignProduct 
Inner join Product p ON CampaignProduct.ProductId=p.Id 
inner join Category ON p.CategoryId=Category.Id 
Inner join Campaign ON CampaignProduct.CampaignId=Campaign.Id 

パーサはそれを意味を知っていないので、上記の例では、作品があるため

inner join Category ON p.CategoryId=Category.Id 

でエイリアスpはまだ定義されていないいないいない実施例

--select 
-- p.CategoryId 
--,p.Name 
--,[dbo].CampaignProduct.CampaignId 
--,[dbo].CampaignProduct.ProductId 
--,[dbo].Category.Name 
--from CampaignProduct 
-- inner join Category ON p.CategoryId=Category.Id 
-- Inner join Campaign ON CampaignProduct.CampaignId=Campaign.Id 
-- Inner join Product p ON CampaignProduct.ProductId=p.Id 

あなたの下テーブルがまだ言及されていない(それは以下の結合にある)製品を置いても認識されないので注意してください。

またbeginginers:SQLは(Java、C#、PHP)のような手続き型言語ではなく、単にそれらのテーブルがどう関係しているかを宣言し、データセット "関数"の結果を求めるだけです。レコードが取り出される順序は問題ではなく、インデックス、ヒューリスティック、統計などを基にした最適な方法であると考えられます。

0

いくつかの検証を追加する必要があります現在のアイテムが依存するテーブルがSQLに追加されました。そうでない場合は、現在の項目を追加する前にそれらを追加します。 SQLを構築するためにラウンドを繰り返す前に、順序付きリストに並べ替える方が簡単です。

var ordered = new List<QueryCreatorType>(); 
foreach (var item in res) 
{ 
    if (!ordered.Any(x => x.Table == item.Parent.Table)) 
    { 
     ordered.Add(item.Parent); 
    } 
    ordered.Add(item); 
} 

注 - このコードはテストしていませんが、開始する必要があります。あなたは、おそらくどこかでインターネット上のこの種のコードのより良い例があるので、Googleにそれをしたいかもしれません。

他にも、SQLの構築はSQLインジェクションを開くことを示唆しており、使用している項目を検証する必要があります。

+0

そのかなりビット私は欲しいものの、まだ傾けることができますその点 –

関連する問題