繁体   English   中英

从另一个表填充SQL表列

[英]Populate SQL table column from another table

我有一个jqGrid(最新的免费jqGrid版本)表,使用Java REST服务填充了来自数据库(MS SQL)的数据。 jqGrid列之一是其带有6个选项的下拉列表。

我的任务是创建另一个包含下拉列表值的数据库表,并使用外键/主键自动填充第一个表的DDL值。

我无法理解其背后的逻辑。 有人可以向我解释一下吗? 我怎样才能做到这一点。 我是否仅从jqGrid发送一个ID,并根据该ID(1,2,..,6)选择在表#1 DDL列中设置的内容(将发送的ID与包含DDL值的表的ID进行比较)?

我感到自己表现得不好……希望你们能理解我。

我们可以从数据库表开始。 看起来像

CREATE TABLE dbo.OrderStatus (
    Id int IDENTITY NOT NULL,
    Name nvarchar(100) NOT NULL,
    CONSTRAINT PK_LT_OrderStatus PRIMARY KEY CLUSTERED (Id),
    CONSTRAINT UC_LT_OrderStatus_Name UNIQUE NONCLUSTERED (Name)
)

它允许通过IdName寻址此类OrderStatus表的任何Item。 UNIQUE CONSTRAINT不允许添加名称重复项。 另一个表Order可以有列

CREATE TABLE dbo.Order (
    Id int IDENTITY NOT NULL,
    OrderStatusId int NOT NULL,
    ...
)

ALTER TABLE dbo.Order  WITH CHECK ADD  CONSTRAINT FK_Order_OrderStatus
FOREIGN KEY(OrderStatusId) REFERENCES dbo.OrderStatus (Id)

在使用数据填充网格期间,您有两个主要选项:在数据中使用OrderStatusId或使用dbo.OrderStatus中的相应Name

SELECT Id,OrderStatusId, ...  FROM dbo.Order

要么

SELECT Id,os.Name AS OrderStatus, ...
FROM dbo.Order AS o
    INNER JOIN dbo.OrderStatus AS os ON os.Id=o.OrderStatusId

如果决定用ID( OrderStatusId值)填充网格,则必须使用formatter: "select"以在相应的列中显示文本(请参见此处 )。 它要求您必须用editoptions.value所有不同的值填充dbo.OrderStatus 实现此目的的最佳方法是扩展服务器的响应,以使用自定义数据填充网格,并使用beforeProcessing设置editoptions.value 我在答案中描述了这种情况。 我会在下面提醒您。

让我们从服务器的响应看起来像

{
    "rows": [{...}, {...}]
}

如果返回的数据看起来像

[{...}, {...}]

那么您应该包括包装纸。 我建议你

SELECT Id,Name FROM dbo.OrderStatus

除了dbo.OrderSELECT * FROM dbo.Order )中进行主要选择外, dbo.Order 这两个结果都放入服务器响应中:

{
    "orderStatus": [{"id":1, "name":"Pending"}, ...],
    "rows": [{...}, {...}]
}

要处理orderStatus您需要添加以下beforeProcessing ,其读取orderStatus并设置editoptions.valueorderStatus列的orderStatus

beforeProcessing: function (response) {
    var $self = $(this), orderStatus = response.orderStatus, i, values = "";
    if (orderStatus != null && orderStatus.length > 0) {
        for (i = 0; i < orderStatus.length; i++) {
            if (values.length > 0) {
                values += ";";
            }
            values += orderStatus[i].id + ":" + orderStatus[i].name;
        }
        $self.jqGrid("setColProp", "orderStatus", {
            editoptions {
                value: values
            }
        });
        if (this.ftoolbar) { // filter toolbar exist
            $self.jqGrid("destroyFilterToolbar");
            $self.jqGrid("filterToolbar");
        }
    }
}

上面的代码未经测试,但我希望主要思想应该从中明确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM