DBF数据库条件连接正确语法DBF-已编辑

时间:2018-09-12 14:51:02

标签: c# jointable foxpro dbf

我有4个表(ROUTBOM,HARD,MAT,ROUT)。在主表ROUTBOM中,我具有ID,PROD_NO和TYPE列。我必须根据TYPE和(ID或PROD_NO)进行选择。条件如下。可以使用内部联接-在联接之前有条件吗?

数据库是FoxPro

using (OleDbConnection con = new OleDbConnection(@"provider=VFPOLEDB;Data source=c:\test\Data"))

数据: 路由

id      qty      prod_no    Type    Name
20322   0.15000             2       ???    get name from HARD
        2.00000 0066773     4       ???    get name from ROUT
37500   4.00000             2       ???    get name from HARD
29750   4.00000             1       ???    get name from MAT

硬表

ID      NAME
20322   H68NK0005
37500   HAS2-30XX-H HYBRID POWDER

MAT TABLE

ID      NAME
29750   NEOPRENE (McMASTER 8694K61)
02125   SPRING STEEL STRIP .008'' X .50'' X 60''

路线表

ID      NAME
0066773 L.V. DOOR ARC PROOF J4
000198  DEVEL. L.V. DOOR J4

必填输出

id      qty      prod_no    Type    Name
20322   0.15000             2       H68NK0005
        2.00000 0066773     4       L.V. DOOR ARC PROOF J4
37500   4.00000             2       HAS2-30XX-H HYBRID POWDER
29750   4.00000             1       NEOPRENE (McMASTER 8694K61)

查询:

条件:

if id is not null and type 2 JOIN ROUTBOM.id with MAT.id to get the name of material
if id is not null and type 1 JOIN ROUTBOM.id with HARD.id to get the name of hadware
if id is empty and type 4 JOIN ROUTBOM.prod_no with ROUT.id to get the name of part

可以在一个查询中完成吗?我不知道必须在哪里应用条件。一旦我进行了第一次JOIN,查询就会从HARD中获取全部数据。

查询行数据

@"SELECT    
                                    t0.Id, 
                                    t1.Name,
                                    t0.Per_Router,
                                    t0.Prod_No,
                                    t0.Rout_No,
                                    t0.Seq,
                                    t0.Type
                                    FROM {0} t0 , "Routbom", "Hardware", "Material", "Rout");

2 个答案:

答案 0 :(得分:0)

从您的有限解释中,我了解到这一点:

string sql = @"SELECT Id,Name,Per_Router,Prod_No,Rout_No,Seq,Type
from
(
    Select t0.*, t1.Name as Name 
    from RoutBom t0
    inner join Mat t1 on t0.Id = t1.Id
    where t0.type = 2
    union 
    Select t0.*, t1.Name as Name 
    from RoutBom t0
    inner join Hard t1 on t0.Id = t1.Id
    where t0.type = 1
    union
    Select t0.*, t1.Name as Name 
    from RoutBom t0
    inner join Rout t1 on t0.Prod_no = t1.Id
    where t0.type = 4 and Empty(Nvl(t0.id,''))
) tmp
";
DataTable tbl = new DataTable();
using (OleDbConnection con = new OleDbConnection(@"provider=VFPOLEDB;Data source=c:\test\Data"))
using (OleDbCommand cmd = new OleDbCommand(sql, con))
{
 con.Open();
 tbl.Load(cmd.ExecuteReader());
}
// Do something with tbl

使用Linq可能更容易。检查Tom Brother的Linq To VFP和VFP实体框架。

这是另一种方法,并且可以解决工会问题:

void Main()
{
    string sql = @"SELECT *, 
    Cast(icase(
    type = '1', (select Name from Mat t1 where t0.Id = t1.Id),
    type = '2', (select Name from Hard t1 where t0.Id = t1.Id),
    empty(nvl(id,'')) and type='4', (select Name from Rout t1 where t0.Prod_No = t1.Id),
    '') as c(100)) as Name
    from RoutBom t0";
    DataTable tbl = new DataTable();
    using (OleDbConnection con = new OleDbConnection(@"provider=VFPOLEDB;Data source=c:\Test\Data"))
    using (OleDbCommand cmd = new OleDbCommand(sql, con))
    {
        con.Open();
        tbl.Load(cmd.ExecuteReader());
    }
    // Do something with tbl
    tbl.Dump(); // you said LinqPad above
} 

答案 1 :(得分:0)

首先,我建议您学习JOIN的“标准” SQL基础(不是VFP特定)。您可以在Inner and Outer JOINs in SQL

上找到很好的解释。

然后将其应用于您的表。 基本上,您将有1个“父”表和3个“子”表,它们通过SQL语法联接到“父”表。

VFP SQL语法与“通用” SQL语法略有不同,但是在大多数情况下,“通用”语法可以正常工作。

也许是这样的:

def permutations(A):
    P = []
    permutationsI(A, P)
    print(P)

def permutationsI(A, perms):
   stack = [(A, [])]
    while len(stack):
        first, last = stack.pop()
        if len(first):
            for i in range(len(first)):
                stack.append((first[:i] + first[i+1:],last + [first[i]]))
        else:
            perms.append(last)

permutations([1,2,3])
>>[[3, 2, 1], [3, 1, 2], [2, 3, 1], [2, 1, 3], [1, 3, 2], [1, 2, 3]]

请注意,这只是记录下来的,未经测试,但这是“ BASIC” SQL语法,在尝试将其应用于项目之前应了解该语法。

也许您想去:www3schools - SQL SELECT syntax

祝你好运