假设我有一个表CUSTOMERS,其密钥为CUSTOMER_ID。我想根据查询返回多行:
SELECT NAME FROM CUSTOMERS WHERE CUSTOMER_ID in (130,130);
这总是返回匹配的单行,尽管我希望它出现两次。我的动机有点复杂,比上面的小例子复杂得多。我想剪切并粘贴此信息的电子表格是我无法访问的复杂连接的结果。我拥有的列表有43,000条记录。我在过去通过将行卸载到文件中并循环输入输入列表并轻松输出来完成此操作。我可以使用一个巧妙的SQL技巧吗?
答案 0 :(得分:2)
您可以UNION ALL
查询自己。这应该是行的两倍。
SELECT NAME FROM CUSTOMERS WHERE CUSTOMER_ID IN (130,131,...)
UNION ALL
SELECT NAME FROM CUSTOMERS WHERE CUSTOMER_ID IN (130,131,...)
应该这样做。我希望你有充分的理由,因为它根本就是错误的。
创建一个包含一列和两行的虚拟表。加入它,没有任何限制,允许数据库创建笛卡尔积:
CREATE TABLE dummy ( foo INTEGER PRIMARY KEY );
INSERT INTO dummy VALUES (1);
INSERT INTO dummy VALUES (2);
SELECT NAME FROM CUSTOMERS JOIN dummy WHERE CUSTOMER_ID IN (130,131,...)
您可以使用带有一堆值1 .. n 的虚拟表,通过更改连接条件/ where子句来生成每行的1到 n 个副本。
答案 1 :(得分:1)
无论产生什么逻辑,“IN(130,130)”都可能很容易生成
从CUSTOMER_ID = 130的客户中选择姓名 从CUSTOMER_ID = 130
的客户中选择名称会给你两次(并且可能更容易生成)。
答案 2 :(得分:1)
这是一个可能的解决方案:
SELECT c.NAME FROM CUSTOMERS c
JOIN (SELECT 130 AS CUSTOMER_ID UNION ALL SELECT 130) x
USING (CUSTOMER_ID);
请注意,在不命名表的情况下进行选择的语法取决于供应商。例如,上面的示例适用于MySQL和Microsoft SQL Server,但不适用于Oracle。
您还可以将值130, 130
存储为临时表中的单独行,然后将临时表加入CUSTOMERS
。