从另一个 table 填充 SQL table 列

Populate SQL table column from another table

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

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

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

我感觉我表达得不好...希望你们能理解我。

我们可以从数据库入手table。它可能看起来像

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 table 的任何项目。 UNIQUE CONSTRAINT 不允许添加重复名称。另一个 table 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" 在相应的列中显示文本(参见 here). It required that you would have to have editoptions.value filled with all different values from dbo.OrderStatus. The best way to implement this would be to extend the response from the server for filling the grid with your custom data and to use beforeProcessing to set editoptions.value. I described the scenario in the answer。我下面会提醒你。

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

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

如果返回的数据看起来像

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

那么你应该包括包装。我建议你制作

SELECT Id,Name FROM dbo.OrderStatus

另外dbo.OrderSELECT * FROM dbo.Order)制作主要的select然后你放置两者 导致服务器响应:

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

要处理 orderStatus,您需要添加以下 beforeProcessing,它读取 orderStatus 并设置网格 orderStatus 列的 editoptions.value

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");
        }
    }
}

以上代码未经测试,但希望能从中清楚主要思想。