非常复杂的TSQL与INNER JOIN相同的表两次

时间:2013-06-01 12:50:47

标签: sql tsql sqlcommand

假设我有2个表(事实上这个命令中有更多表,但只有那些会影响问题)。

表A具有唯一帐户,表C具有唯一材料。

现在让我们说ID为11的唯一帐户可以有很少的独特材料(例如:10,18,19,24)。

材料可以是相同类型或不同(例如:10 - 类型2,18 - 类型2,19类型1,24类型3)并且它们具有数字(例如:10 - A24,18 - A25,19 - A24 ,24 - B55)和许多其他值(但例如1就足够了。)

每个材料在专用列中都有帐户ID。

现在我需要根据输入字符串标准在DataTable中选择一些值:

String1 = Afst; //some value from tableA
//...
String2 = Ctype; // SomeType of Material from table C
String3 = dn; // number of Material from table C

Afst(tableA)| ... | dn(C C的tableC编号)| dn2(Type2的Type2)

其中dn2指定了类型。

这里的问题是我需要选择所有具有Ctype的材料,即使此帐户不存在Type2。

例如,当Ctype和Type2都存在于:

时,这将给出所有结果
("SELECT a.id, a.Afst, c.dn, d.dn as 'dn2' FROM sometableA a INNER JOIN sometableC c ON a.id=c.idofa INNER JOIN sometableC d ON a.id=d.idofa WHERE a.Afst like '%" + String1 + "%' and c.MaterialType='" + String2 + "' and c.dn like '%" + String3 + "%' and d.MaterialType='2'");

注意:我不允许以任何方式更改数据库表,因此我无法按类型将Material表拆分为表。

这也应该在单个TSQL命令中。

1 个答案:

答案 0 :(得分:1)

我不确定是否理解正确,也许第一次加入必须是inner

SELECT a.id, a.Afst, c.dn, d.dn as 'dn2'
  FROM sometableA a
  LEFT JOIN sometableC c ON a.id=c.idofa  and c.MaterialType = 'String2' and c.dn like '%String3%'
  LEFT JOIN sometableC d ON a.id=d.idofa  and d.MaterialType= '2'
  WHERE a.Afst like '%String1%'