Php 如果产品有条形码且所有产品都没有条形码,则按产品条形码进行Sql查询
我收集了一些产品,有些产品有条形码,有些没有条形码。所以,我想显示所有没有条形码的产品,如果任何产品有条形码,那么它们将按条形码分组,这样我只能显示一个 假设下表中有如下产品:Php 如果产品有条形码且所有产品都没有条形码,则按产品条形码进行Sql查询,php,mysql,sql-server,Php,Mysql,Sql Server,我收集了一些产品,有些产品有条形码,有些没有条形码。所以,我想显示所有没有条形码的产品,如果任何产品有条形码,那么它们将按条形码分组,这样我只能显示一个 假设下表中有如下产品: ID Name Barcode 1 ABC 349377934434 2 DEF 349377934434 3 XYZ NULL 4 XXX NULL 根据上述给定数据,我的查询应该只给出
ID Name Barcode
1 ABC 349377934434
2 DEF 349377934434
3 XYZ NULL
4 XXX NULL
根据上述给定数据,我的查询应该只给出3种产品,即1或2、3和4。对于上述条件,sql查询将是什么?我想在单个查询中获取数据。我不想在代码中使用循环来查找上述条件下的产品
请帮我写这篇文章好吗?提前感谢看到您将SQL Server包括在列表中,下面是一个将在列表中运行的示例:
DECLARE @table TABLE (id INT, name VARCHAR(20), barcode VARCHAR(20));
INSERT INTO @table SELECT 1, 'ABC', '349377934434';
INSERT INTO @table SELECT 2, 'DEF', '349377934434';
INSERT INTO @table SELECT 3, 'XYZ', NULL;
INSERT INTO @table SELECT 4, 'XXX', NULL;
WITH Summary AS (
SELECT
ISNULL(barcode, CONVERT(VARCHAR(50), NEWID())) AS barcode,
MAX(name) AS name
FROM
@table
GROUP BY
ISNULL(barcode, CONVERT(VARCHAR(50), NEWID())))
SELECT
CASE WHEN barcode LIKE '%-%' THEN NULL ELSE barcode END AS barcode,
name
FROM
Summary;
这是非常不言自明的,我按条形码分组,在有重复项的地方按名称取最上面的结果。如果条形码为空,我将用随机GUID替换它,然后在最后将其去掉
结果如下:
barcode name
349377934434 DEF
NULL XXX
NULL XYZ
对于MySQL(我不知道如何在MySQL中使用临时表,所以我创建/删除简单表“temp”):
使用带有CTE的接头如何: 设置
CREATE TABLE #Products
( ID int,
Name VARCHAR(5),
BarCode VARCHAR(15) NULL
)
INSERT INTO #Products
VALUES (1, 'ABC', '349377934434'),
(2, 'DEF', '349377934434'),
(3, 'XYZ', NULL),
(4, 'XXX', NULL)
查询:
;WITH CTE
As
(
SELECT ID, Name, BarCode, ROW_NUMBER() OVER (Partition By BarCode ORDER BY ID) AS RN
FROM #Products
WHERE BarCode is NOT Null
)
SELECT ID, Name, BarCode
FROM #Products
WHERE BarCode is Null
UNION
SELECT ID, Name, BarCode
FROM CTE
WHERE RN = 1
DROP TABLE #Products
谢谢你的回复。我们如何在Mysql中实现这一点?感谢您的回复。我们如何在Mysql中实现这一点?谢谢。这就是我要找的东西。
CREATE TABLE #Products
( ID int,
Name VARCHAR(5),
BarCode VARCHAR(15) NULL
)
INSERT INTO #Products
VALUES (1, 'ABC', '349377934434'),
(2, 'DEF', '349377934434'),
(3, 'XYZ', NULL),
(4, 'XXX', NULL)
;WITH CTE
As
(
SELECT ID, Name, BarCode, ROW_NUMBER() OVER (Partition By BarCode ORDER BY ID) AS RN
FROM #Products
WHERE BarCode is NOT Null
)
SELECT ID, Name, BarCode
FROM #Products
WHERE BarCode is Null
UNION
SELECT ID, Name, BarCode
FROM CTE
WHERE RN = 1
DROP TABLE #Products